【问题标题】:Query XML source in LinqPad using lambda syntax使用 lambda 语法在 LinqPad 中查询 XML 源
【发布时间】:2015-06-19 09:05:28
【问题描述】:

考虑到以下 XML 数据存储在 xmlData.xml 文件中,我尝试使用 LinqPad 使用 lambda 语法对其进行查询。

我记得以前用过这个,但想不通了。我可以像在 Visual Studio 中查询对象一样使用属性查询数据。

    <?xml version="1.0"?>
<ArrayOfHROps_User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <HROps_User>
    <EntityKey>
      <EntitySetName>HROps_User</EntitySetName>
      <EntityContainerName>HROperationsEntities</EntityContainerName>
      <EntityKeyValues>
        <EntityKeyMember>
          <Key>UserID</Key>
          <Value xsi:type="xsd:int">44405</Value>
        </EntityKeyMember>
      </EntityKeyValues>
    </EntityKey>
    <UserID>44405</UserID>
    <EmployeeID>AAA40</EmployeeID>
    <Period>2015-06-17T00:00:00</Period>
    <Active>true</Active>
    <Options>false</Options>
    <Pager>false</Pager>
    <Contractor>false</Contractor>
    <TimeStamp>2015-06-18T13:37:38.3</TimeStamp>
    <UserName>Mark.Walsh</UserName>
  </HROps_User>
  <HROps_User>
    <EntityKey>
      <EntitySetName>HROps_User</EntitySetName>
      <EntityContainerName>HROperationsEntities</EntityContainerName>
      <EntityKeyValues>
        <EntityKeyMember>
          <Key>UserID</Key>
          <Value xsi:type="xsd:int">44406</Value>
        </EntityKeyMember>
      </EntityKeyValues>
    </EntityKey>
    <UserID>44406</UserID>
    <EmployeeID>AAA60</EmployeeID>
    <Period>2015-06-17T00:00:00</Period>
    <Active>true</Active>
    <Options>false</Options>
    <Pager>false</Pager>
    <Contractor>false</Contractor>
    <TimeStamp>2015-06-18T13:37:38.94</TimeStamp>
    <UserName>Mark.Walsh</UserName>
  </HROps_User>

在 LinqPad 中 - 这些语句加载数据并正确输出:

var myxml = XElement.Load (@"c:\temp\xmlData.xml");
myxml.Elements().Dump();

我希望以下内容也可以:

myxml.Elements().FirstOrDefault(x=>x.UserName == "Mark.Walsh").Dump();

但它给了我错误:

“System.Xml.Linq.XElement”不包含“UserName”的定义,并且找不到接受“System.Xml.Linq.XElement”类型的第一个参数的扩展方法“UserName”(按 F4 到添加 using 指令或程序集引用)

再一次,我记得以前有一个很好的简洁语法,但我无法弄清楚它到底是怎么回事。 谢谢!

【问题讨论】:

    标签: c# xml linq lambda linqpad


    【解决方案1】:

    可能您的意思是使用 Element() 方法将元素名称作为参数传递:

    myxml.Elements()
         .FirstOrDefault(x => (string)x.Element("UserName") == "Mark.Walsh")
         .Dump();
    

    Dotnetfiddle Demo

    【讨论】:

      【解决方案2】:

      最后我不得不:

      • 序列化我的对象列表
      • 将其保存为 .xml 文件
      • 将我的类定义复制到 LinqPad 中
      • 在 XML 文件中加载
      • 将其反序列化为类类型

      然后像在 VS 中那样使用 lambda 表达式遍历列表。 有点迂回的方式,但它让我能够查询最接近 VS 语法的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        相关资源
        最近更新 更多