2015-06-19 36 views
2

考慮到存儲在文件xmlData.xml中的以下XML數據,我試圖使用LinqPad使用lambda語法對其進行查詢。使用lambda語法在LinqPad中查詢XML源

我記得以前用過這個,但是不能再弄明白。我可以使用屬性查詢數據,就像我在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' does not contain a definition for 'UserName' and no extension method 'UserName' accepting a first argument of type 'System.Xml.Linq.XElement' could be found (press F4 to add a using directive or assembly reference)

再次,我記得之前有一個很好的乾淨的語法,但我無法弄清楚它到底是怎麼回事。 謝謝!

回答

-1

最後我只好:

  • 序列化我的對象
  • 列表
  • 將其保存爲一個.xml文件
  • 我的類定義複製到LinqPad
  • 加載XML文件中
  • 它反序列化類的類型

然後在列表中使用lambda表達式作爲迭代我會在VS. 有點迂迴的方式,但它讓我能夠查詢最接近VS語法的結果。

3

也許你的意思是使用Element()方法通過元件的名稱參數:

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

Dotnetfiddle Demo