如何使用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
相关产品推荐
相关产品推荐

