2016-08-09 45 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