【问题标题】:How to add OR condition in LINQ while querying XML?查询 XML 时如何在 LINQ 中添加 OR 条件?
【发布时间】:2016-08-09 16:48:44
【问题描述】:

问题:返回所有记录whereJon Doe=<bus_contact><bus_sponsor>

当前代码返回记录 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 ();
    }
}

编辑:这与可能的重复链接中指出的问题不完全相同。是的,它部分提到了这一点,但作为初学者,在接受的答案提供的适当上下文中获得答案是非常有帮助的。

【问题讨论】:

标签: c# xml linq


【解决方案1】:

||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 爬回树的必要性。

【讨论】:

  • 太棒了。谢谢!!!时间限制结束后将立即接受答案。
【解决方案2】:

如果每个row 元素只有一个子元素项(bus_contactbus_sponsor 等),您可以使用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
    });

【讨论】:

  • @cyboashu 未添加到答案中,但如果 row 标签是 root 的唯一孩子,您也可以将 Descendants 替换为 Elements(复数)
猜你喜欢
  • 1970-01-01
  • 2016-09-22
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多