首页 > 解决方案 > 在过滤器 && 属性的 Linq 中使用变量

问题描述

嗨,我想过滤一个元素和一个属性,就像在 MS 示例中一样,但不是使用严格的字符串,而是我想使用一个变量(来自数组或列表的元素,如下例中的状态。这可能吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LinqFilterTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            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"

            };


            for (int i = 0; i < 3; i++)
            {
                var state = items[i];
                IEnumerable<XElement> purchaseOrders =
                    from el in root.Elements(aw + "PurchaseOrder")
                    where
                        (from add in el.Elements(aw + "Address")
                         where
                             //(string)add.Attribute(aw + "Type") == "Shipping" &&
                             (string)add.Element(aw + "State") == state
                         select add)
                        .Any()
                    select el;
                foreach (XElement el in purchaseOrders)
                    Console.WriteLine((string)el.Attribute(aw + "State"));

            }
        }
    }
}

标签: c#linq

解决方案


编辑:适用于变量。

 static void Main(string[] args)
 {
     XElement root = default;
     string[] items = new string[3] { "NY", "CA", "FL" };

     // Without Namespace
     Console.WriteLine("Without namespace LINQ:\n");
     root = XElement.Load("H:\\PurchaseOrders.xml");

     foreach (var el in from state in items
                        let purchaseOrders = from el in root.Elements("PurchaseOrder")
                                             where (from add in el.Elements("Address")
                                                    where (string)add.Attribute("Type") == "Shipping"
                                                       && (string)add.Element("State") == state
                                                    select add).Any()
                                             select el
                        from XElement el in purchaseOrders
                        select el)
     {
         Console.WriteLine((string)el.Attribute("PurchaseOrderNumber"));
     }

     // With Namespace
     Console.WriteLine("\nWith namespace LINQ:\n");
     root = XElement.Load("H:\\PurchaseOrdersInNamespace.xml");
     XNamespace aw = "http://www.adventure-works.com";

     foreach (var el in from state in items
                        let purchaseOrders = from el in root.Elements(aw + "PurchaseOrder")
                                             where (from add in el.Elements(aw + "Address")
                                                    where (string)add.Attribute(aw + "Type") == "Shipping" 
                                                       && (string)add.Element(aw + "State") == state
                                                    select add).Any()
                                             select el
                        from XElement el in purchaseOrders
                        select el)
     {
         Console.WriteLine((string)el.Attribute(aw + "PurchaseOrderNumber"));
     }

     Console.ReadKey();
}

在此处输入图像描述


推荐阅读