题
你会如何建立这种查询的实体的框架:
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到实体和ESQL)的直接支持嵌套的XML查询。所以,你不会是能够做到这样的事情。除非在运行XML查询之后调用AsEnumerable()
,这当然是从性能的角度有所不希望的。
说到这里,你大概可以写在做这个过滤器对您的SSDL储存功能。
打开EDMX在XML编辑文件上,然后试图加入下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;
请注意,所有上面的代码仅仅是伪代码,我没有实际测试过,我只是想帮助你开始。
希望这有助于
亚历
程序管理实体框架队
其他提示
两种选择:
- 写proc其返回的所有数据所需的地图的一个实体的种类,并且把你的SQL。这种方法可以使用XML指数数据库服务器。
- 检索的数据上的客户,然后修建一个XML doc和使用皇宫于XML。方便的程序,但不能使用XML索引。
皇宫的实体并不知道有关数据库服务器XML特征。
不隶属于 StackOverflow