你会如何建立这种查询的实体的框架:

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;

请注意,所有上面的代码仅仅是伪代码,我没有实际测试过,我只是想帮助你开始。

希望这有助于

亚历

程序管理实体框架队

其他提示

两种选择:

  1. 写proc其返回的所有数据所需的地图的一个实体的种类,并且把你的SQL。这种方法可以使用XML指数数据库服务器。
  2. 检索的数据上的客户,然后修建一个XML doc和使用皇宫于XML。方便的程序,但不能使用XML索引。

皇宫的实体并不知道有关数据库服务器XML特征。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top