【问题标题】:Entity Framework Query Xml实体框架查询 XML
【发布时间】:2009-07-09 23:42:04
【问题描述】:

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

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

数据列是 XML。显然这是由实体框架转换为字符串...

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

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(...)

【问题讨论】:

    标签: xml entity-framework


    【解决方案1】:

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

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

    在 XML 编辑器中打开 EDMX 文件,然后尝试在 StorageModel 部分(即 SSDL)下添加一个元素。该存储函数的&lt;CommandText&gt;(我认为这就是它的名称)是您可以编写适当的 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 中编写存根函数,这样您也可以在 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;
    

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

    希望对你有帮助

    亚历克斯

    项目经理实体框架团队

    【讨论】:

    【解决方案2】:

    两个选择:

    1. 编写一个过程,它返回映射到实体类型所需的所有数据,并将您的 SQL 放在那里。此方法可以使用 DB 服务器上的 XML 索引。
    2. 在客户端检索数据,然后构造一个 XML 文档并使用 LINQ to XML。方便程序员,但不能使用 XML 索引。

    LINQ to Entities 不了解 DB 服务器 XML 功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2013-03-17
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      相关资源
      最近更新 更多