c# - 如何在查询 XML 时在 LINQ 中添加 OR 条件?

标签 c# xml linq

问题:返回所有记录where Jon 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 ();
    }
}

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

最佳答案

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

关于c# - 如何在查询 XML 时在 LINQ 中添加 OR 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38856401/

相关文章:

xml - 使用XPath从RSS feed中选择前5个元素

c# - IEnumerable<dynamic> 与 linq

C# - 计算多个文件的总统计数据

java - Jaxb 如何为其他 xml 元素创建 xml 元素容器

c# - SelectList 文本中的多个值

c# - 避免使用 if-else 或 switch-case 语句来进行决定

C# 检查对象是否属于仅在运行时已知的类型

xml - xpath 在属性不存在时按属性选择

c# - 第一的?单例的?还是默认?

c# - 在 C# 中显示小数到第 n 位