2016-08-09 53 views
6

問題:返回所有記錄whereJon Doe=<bus_contact><bus_sponsor>如何在查詢XML時在LINQ中添加OR條件?

當前代碼返回記錄1,因此需要進行哪些修改才能使用一個查詢返回記錄1和2?

XML

<root> 
    <row> 
    <project_id>1</project_id> 
    <project_name>Name1</project_name> 
    <bus_contact>Jon Doe</bus_contact> 
    <bus_sponsor>Bruce Wayne</bus_sponsor> 
    </row> 
    <row> 
    <project_id>2</project_id> 
    <project_name>Name2</project_name> 
    <bus_contact>Peter Parker</bus_contact> 
    <bus_sponsor>Jon Doe</bus_sponsor> 
    </row> 
</root> 

C#

class Program 
{ 
    static void Main (string[] args) 
    { 
     XElement main = XElement.Load ("master_list.xml"); 

     var results = main.Descendants ("row") 
      .Descendants ("bus_contact") 
      .Where (e => e.Value == "Jon Doe") 
      .Select (e => e.Parent)    
      .Select (e => new { 
       project_id = e.Descendants ("project_id").FirstOrDefault().Value, 
       project_name = e.Descendants ("project_name").FirstOrDefault().Value 
      }); 

     foreach (var result in results) 
      Console.WriteLine ("{0}, {1}", result.project_id, result.project_name); 
     Console.ReadLine(); 
    } 
} 

編輯:這不正是爲可能的重複鏈接指出了同樣的問題。是的,它部分地提到了這一點,但作爲一個初學者,通過適當的上下文來獲得答案,這是接受的答案提供的,是相當有幫助的。

+0

[多個子孫類型的可能的複製有各種(bus_contactbus_sponsor等),可以簡化整個查詢的唯一一個子元素項目linq](http://stackoverflow.com/questions/2059488/multiple-descendants-types-linq) –

回答

4

使用||結合Any,像這樣:

var results = main.Descendants("row") 
    .Where(r => 
     r.Descendants("bus_contact").Any(c => c.Value == "Jon Doe") 
    || r.Descendants("bus_sponsor").Any(c => c.Value == "Jon Doe") 
    ); 

使用Any,您可以查詢到條件對一個孩子,實際上並沒有下降到孩子的水平。這消除了通過選擇Parent來爬回樹的必要性。

+0

太棒了。謝謝!!!只要時限結束,答案將被接受。 – cyboashu

1

如果每個row元素使用Element方法,而不是Descendants

var results = 
    main.Descendants ("row") 
    .Where (r => r.Element("bus_contact").Value == "Jon Doe" 
       || r.Element("bus_contact").Value == "Jon Doe") 
    .Select (r => new { 
     project_id = r.Element("project_id").Value, 
     project_name = r.Element("project_name").Value 
    }); 
+0

謝謝。不知道這個。 ++ – cyboashu

+1

@cyboashu沒有加入回答,但如果'行'標籤是'root'的唯一孩子,你也可以用'Elements'替換'Descendants'(複數) – Sehnsucht

+0

太棒了。再次感謝。! – cyboashu