Lie*_*oen 7 xml entity-framework
如何使用Entity Framework构建此查询:
SELECT *
FROM TreeNodes
WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'
Run Code Online (Sandbox Code Playgroud)
数据列是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);
Run Code Online (Sandbox Code Playgroud)
我也试过类似下面的代码,但是也没有用:
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(...)
Run Code Online (Sandbox Code Playgroud)
Ale*_*mes 10
Entity Framework的查询语言(LINQ to Entities和eSQL)都不直接支持嵌套的XML查询.所以你无法做到这一点.除非您在调用之后运行XML查询AsEnumerable(),从性能角度来看,这当然是不可取的.
说过你可以在SSDL中编写一个Store Function来为你做这个过滤器.
在XML编辑器中打开EDMX文件,并尝试在StorageModel部分(即SSDL)下添加元素.该<CommandText>Store函数的(我认为这就是所谓的)是您可以编写适当的T-SQL的地方,您也可以参考该函数的参数.对不起,我没有这个方便的例子.
完成后,您可以在eSQL中调用Store函数,例如:
SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1'
Run Code Online (Sandbox Code Playgroud)
在.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");
}
Run Code Online (Sandbox Code Playgroud)
然后这样的事情:
var query = from e in edumatic3Context.TreeNodes
where MyXmlHelper("(/edumatic/assessmentItem/@type)[1]", e.Data)
.StartsWith("multiplechoice1")
select e;
Run Code Online (Sandbox Code Playgroud)
请注意以上所有代码都只是伪代码我还没有真正测试过,我只是想帮助你开始.
希望这可以帮助
亚历克斯
项目经理实体框架小组