【问题标题】:Integrate an Xpath statement into a Linq query of a WCF service将 Xpath 语句集成到 WCF 服务的 Linq 查询中
【发布时间】:2012-08-20 21:24:58
【问题描述】:

您好,提前感谢您的帮助。 我有一个托管在具有两列的服务器上的 sql 表:ID(int)、server_info(xml) 此表中的 xml 条目如下所示:

<ServerID>11</ServerID><GroupID /><ParentID>15</ParentID><ServerName>IAProd1</ServerName><User>admin</User><UID>123</UID><PWD>password</PWD><Domain>TestDomain</Domain><Location>Left</Location>

此表在我的 Silverlight 应用程序中表示为 ADO.Net 数据实体数据模型。我希望通过 WCF 服务调用一个参数化查询,该查询采用一个 Id 编号并根据嵌入在其 server_info 列的 xml 中的父 id 值在服务器表中查找子项。 在 sql server 上,我可以使用以下带有 xpath 语句的查询来执行此操作:

<!--uses xpath statement in the where clause:(server_info.value('(ServerID)[1]', 'int') = 11) --> 
    SELECT     ID, server_info
    FROM         tbl_server_xml
    WHERE     (server_info.value('(ServerID)[1]', 'int') = 11) 

目前我的查询方法如下所示:

public List<tbl_server_xml> getChildServers(int parentId)
        {
            //create instance of Ado.Net entity
            xMonitorXMLTestDBEntities db = new xMonitorXMLTestDBEntities();
            var item = from entry in db.tbl_server_xml
                       where //need assistance with the where clause
                       select entry;

        }

我无法弄清楚如何仅使用服务方法中的 linq 查询或将 xpath 语句集成到 Linq 查询中的方法来执行等效操作。有没有办法做到这一点,还是我要解决这个问题?再次感谢您的帮助。

【问题讨论】:

    标签: c# .net xml linq xpath


    【解决方案1】:

    问题在于您的server_info 不是有效的XML 文档内容,因为它没有根元素。但是通过一个简单的技巧,您可以像这样编写查询

     var item = from entry in db.tbl_server_xml
                           where XDocument.Parse("<Root>" + entry.server_info + "</Root>").
                                 XPathSelectElements("//ServerID[1]").Single().Value == "11"
                           select entry;
    

    或者使用普通的 Linq to XML

    var item = from entry in db.tbl_server_xml
                               where XDocument.Parse("<Root>" + entry.server_info + "</Root>").
                                     Descendants("ServerID").First().Value == "11"
                               select entry;
    

    【讨论】:

    • 感谢您的回复,这看起来很有意义,我想我对 C# 中的 xml 更缺乏经验,然后我才意识到。但是,当我尝试您建议的任何一种方法时,我收到以下错误: //LINQ to Entities 无法识别方法 'System.Collections.Generic.IEnumerable`1[System.Xml.Linq.XElement] Descendants(System. Xml.Linq.XName)' 方法,并且该方法不能翻译成存储表达式。
    • 是否有一个库我需要包含/使用我需要的语句才能在数据实体查询中使用 xml 类?再次感谢您的帮助
    • 是的,如果尚未引用 System.Xml.Linq,您应该添加对它的引用,并将 using System.Xml.XPath;using System.Xml.Linq; 添加到您的源文件中
    • 我有这些参考资料,但仍然无法识别查询。对此帖子的回复:[链接]stackoverflow.com/questions/1103620/… 表明实体框架的查询语言(LINQ to Entities 和 eSQL)都不直接支持嵌套的 XML 查询。你确定不是这样吗?
    • 真的,我以前不知道这个功能,并在简单的List&lt;string&gt; 上测试了你的问题,而不是真正的Entity,但现在我确信它不是那么简单。现在最简单的方法是通过var items = (from entry in db.tbl_server_xml).AsEnumerable();获取所有项目并像以前一样调用Where方法var item = items.Where(entry =&gt; XDocument.Parse("&lt;Root&gt;" + entry.server_info + "&lt;/Root&gt;").XPathSelectElements("//ServerID[1]").Single().Value == "11");
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多