You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ对XML数据执行AND条件查询?

LINQ to XML 筛选同时拥有多个折扣的客户

核心问题在于:你不能直接对单个<discount>节点用AND条件(单个节点的id不可能同时等于两个值),而是要检查客户的所有折扣集合是否同时包含这两个目标折扣ID。下面是具体的LINQ实现方案:

假设你的XML结构如下

<customers>
  <customer>
    <id>01</id>
    <name>John</name>
    <discount id="plumb"/>
    <discount id="lumber"/>
    <discount id="electrical"/>
  </customer>
  <customer>
    <id>02</id>
    <name>Jane</name>
    <discount id="plumb"/>
  </customer>
  <customer>
    <id>03</id>
    <name>Bob</name>
    <discount id="lumber"/>
  </customer>
</customers>

LINQ查询代码(查询表达式写法)

using System.Xml.Linq;
using System.Linq;

// 加载XML文档(也可以用XDocument.Parse直接加载XML字符串)
XDocument customerDoc = XDocument.Load("你的XML文件路径.xml");

// 定义需要同时拥有的折扣ID集合
var requiredDiscounts = new[] { "plumb", "lumber" };

// 筛选符合条件的客户
var eligibleCustomers = from customer in customerDoc.Descendants("customer")
                        // 提取当前客户的所有折扣ID
                        let customerDiscounts = customer.Descendants("discount")
                                                        .Select(d => (string)d.Attribute("id"))
                        // 检查:所有需要的折扣,客户都拥有
                        where requiredDiscounts.All(discount => customerDiscounts.Contains(discount))
                        select new
                        {
                            CustomerId = (string)customer.Element("id"),
                            CustomerName = (string)customer.Element("name")
                        };

// 遍历结果
foreach (var customer in eligibleCustomers)
{
    Console.WriteLine($"ID: {customer.CustomerId}, Name: {customer.CustomerName}");
}

另一种写法(方法链语法)

如果习惯fluent风格的写法,也可以这样写:

var eligibleCustomers = customerDoc.Descendants("customer")
    .Select(c => new
    {
        CustomerNode = c,
        DiscountIds = c.Descendants("discount").Select(d => (string)d.Attribute("id"))
    })
    .Where(item => requiredDiscounts.All(d => item.DiscountIds.Contains(d)))
    .Select(item => new
    {
        CustomerId = (string)item.CustomerNode.Element("id"),
        CustomerName = (string)item.CustomerNode.Element("name")
    });

关键逻辑说明

requiredDiscounts.All(discount => customerDiscounts.Contains(discount))是实现“同时拥有”的核心:它会遍历你指定的所有目标折扣,只有当客户的折扣集合里每一个目标折扣都存在时,才会被选中,完美实现你要的AND逻辑。

内容的提问来源于stack exchange,提问作者Jedi Commymullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:45:12