gpt4 book ai didi

xml - Entity Framework 查询 Xml

转载 作者:数据小太阳 更新时间:2023-10-29 01:46:59 24 4
gpt4 key购买 nike

您将如何使用 Entity Framework 构建此查询:

SELECT  *
FROM TreeNodes
WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'

数据列是 XML。显然, Entity Framework 将其转换为字符串...

这是我的开始,但从这里我不知道如何添加位置...

var query = from e in edumatic3Context.TreeNodes
where e.Data.???????
select e;

foreach (var treeNode in query)
Console.WriteLine("{0} {1} {2} {3}", treeNode.TreeNodeId, treeNode.Name, treeNode.Type, treeNode.DateChanged);

我也试过类似下面的代码,但也没有用:

var sql = "SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'";
var query = edumatic3Context.CreateQuery<TreeNodes>(sql);

foreach(...)

最佳答案

Entity Framework 的查询语言(LINQ to Entities 和 eSQL)都不直接支持嵌套的 XML 查询。所以你将无法做这种事情。除非您在调用 AsEnumerable() 后运行 XML 查询,从性能的角度来看,这当然有些不可取。

话虽如此,您或许可以在 SSDL 中编写一个存储函数来为您执行此过滤器。

在 XML 编辑器中打开 EDMX 文件,并尝试在 StorageModel 部分下添加一个元素(即 SSDL)。 <CommandText> (我认为这就是所谓的)存储函数是您可以编写适当的 T-SQL 的地方,您也可以引用该函数的参数。抱歉,我手边没有这方面的示例。

完成后,您可以在 eSQL 中调用 Store 函数,例如:

SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE 
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1'

在 .NET 4.0 中,您还可以在 .NET 中编写 stub 函数,这样您也可以在 LINQ 中调用该函数:

[EdmFunction("StorageModelNamespace", "MyXmlWrapperFunctionForNVarchar"]
public static string MyXmlHelper(string path, string data)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}

然后是这样的:

var query = from e in edumatic3Context.TreeNodes
where MyXmlHelper("(/edumatic/assessmentItem/@type)[1]", e.Data)
.StartsWith("multiplechoice1")
select e;

请注意,以上所有代码都只是伪代码,我还没有实际测试过,我只是想帮助您入门。

希望对你有帮助

亚历克斯

项目经理 Entity Framework 团队

关于xml - Entity Framework 查询 Xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com