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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:54:04