实体框架查询XML
问题描述:
你将如何建立这个查询与实体框架:实体框架查询XML
SELECT *
FROM TreeNodes
WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'
数据列是XML。显然,这是转换成实体框架的字符串...
这是我的开始,但在这里,我不知道如何添加在那里......
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(...)
答
实体框架的查询语言(LINQ to Entities和eSQL)都不直接支持嵌套的XML查询。所以你不能做这种事情。除非在调用AsEnumerable()
之后运行XML查询,但从性能角度来看,这当然是不合乎需要的。
话虽如此,你可以写一个存储函数在SSDL中为你做这个过滤器。
在XML编辑器中打开EDMX文件,然后尝试在StorageModel部分(即SSDL)下添加一个元素。该存储函数的<CommandText>
(我认为这就是它所称的)是您可以编写适当的T-SQL的位置,您也可以参考该函数的参数。对不起,我没有这个方便的例子。
做完,你可以调用存储功能的ESQL即是这样的:
SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1'
在.NET 4.0中,你还可以在.NET中写一个存根函数,以便您可以调用该函数在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;
请注意以上所有代码都只是伪代码,我没有真正测试过,我只是试图帮助您开始使用。
希望这有助于
亚历
项目经理实体框架团队
答
两个选择:
- 写一个进程,它返回的所有数据需要映射到实体类型,并将SQL放在那里。此方法可以在数据库服务器上使用XML索引。
- 检索客户端上的数据,然后构建XML文档并使用LINQ to XML。方便程序员,但不能使用XML索引。
LINQ to Entities不知道DB服务器的XML功能。
你能推荐一本书来学习实体框架(带存储功能的例子......)?谢谢。 – 2009-07-10 13:44:29