在Linq的where筛选中使用变量与XML属性进行查询
需求完全可以实现
你现有的代码逻辑已经走对了方向,LINQ to XML本身就支持在筛选条件中使用数组、列表等外部变量,不需要必须写死固定字符串。
你当前的实现是通过循环遍历数组逐个查询,逻辑上可以正常运行,但可以做更简洁高效的优化,同时你现有代码存在一个小问题:最终输出时取的是PurchaseOrder节点的State属性,但根据筛选逻辑State是Address节点的子元素,直接输出会拿到空值。
优化后实现方案
不需要循环遍历数组,直接用LINQ的Contains方法可以一次性匹配数组内所有目标值,单次查询就能拿到所有符合条件的结果,性能更好,代码更简洁:
using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace LinqFilterTest { class Program { static void Main(string[] args) { XElement root = XElement.Load(@"C:\Users\john\Desktop\PurchaseOrdersInNamespace.xml"); XNamespace aw = "http://www.adventure-works.com"; // 筛选条件数组,可动态修改 string[] items = new string[3] { "NY", "CA", "FL" }; // 单次查询匹配所有数组内的州 IEnumerable<XElement> purchaseOrders = from el in root.Elements(aw + "PurchaseOrder") where el.Elements(aw + "Address") .Any(add => items.Contains((string)add.Element(aw + "State"))) select el; // 遍历输出结果 foreach (XElement po in purchaseOrders) { // 可根据实际需求调整输出字段,这里示例输出订单号和匹配的州 Console.WriteLine($"采购订单编号:{(string)po.Attribute(aw + "PurchaseOrderNumber")}"); var matchedStates = po.Elements(aw + "Address") .Select(add => (string)add.Element(aw + "State")) .Where(s => items.Contains(s)); Console.WriteLine($"匹配的州:{string.Join(",", matchedStates)}\n"); } } } }
实现原理
LINQ查询的where条件只要求表达式返回布尔值即可,不管你是用固定字符串、变量、数组方法、自定义方法返回的判断结果都可以正常生效,没有必须写死固定值的限制。
内容的提问来源于stack exchange,提问作者Home of Creation
相关产品推荐
相关产品推荐

