Dela via


Så här skriver du frågor med komplex filtrering (LINQ till XML)

Ibland vill du skriva LINQ till XML-frågor med komplexa filter. Du kan till exempel behöva hitta alla element som har ett underordnat element med ett visst namn och värde. Den här artikeln ger ett exempel på hur du skriver en fråga med komplex filtrering.

Exempel: Hitta med en kapslad fråga i - Where satsen

Det här exemplet visar hur du hittar alla PurchaseOrder element som har:

  • Ett underordnat Address element vars Type attribut är lika med "Shipping".
  • Ett underordnat State element som är lika med "NY".

Den använder en kapslad fråga i Where -satsen och operatorn Any returnerar true om samlingen har några element i den. I exemplet används XML-dokumentexempel-XML-fil : Flera inköpsorder.

Mer information om operatorn finns i Any Kvantifieraråtgärder (C#) och Kvantifieraråtgärder (Visual Basic).

XElement root = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> purchaseOrders =
    from el in root.Elements("PurchaseOrder")
    where
        (from add in el.Elements("Address")
        where
            (string)add.Attribute("Type") == "Shipping" &&
            (string)add.Element("State") == "NY"
        select add)
        .Any()
    select el;
foreach (XElement el in purchaseOrders)
    Console.WriteLine((string)el.Attribute("PurchaseOrderNumber"));
Dim root As XElement = XElement.Load("PurchaseOrders.xml")
Dim purchaseOrders As IEnumerable(Of XElement) = _
    From el In root.<PurchaseOrder> _
    Where _
        (From add In el.<Address> _
        Where _
             add.@Type = "Shipping" And _
             add.<State>.Value = "NY" _
        Select add) _
    .Any() _
    Select el
For Each el As XElement In purchaseOrders
    Console.WriteLine(el.@PurchaseOrderNumber)
Next

Det här exemplet genererar följande utdata:

99505

Exempel: Sök i XML som finns i ett namnområde

I följande exempel visas samma fråga som ovan, men för XML som finns i ett namnområde. Mer information finns i Översikt över namnområden.

I det här exemplet används XML-dokumentexempelfil : Flera inköpsorder i ett namnområde.

XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "http://www.adventure-works.com";
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") == "NY"
         select add)
        .Any()
    select el;
foreach (XElement el in purchaseOrders)
    Console.WriteLine((string)el.Attribute(aw + "PurchaseOrderNumber"));
Imports <xmlns:aw='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
        Dim purchaseOrders As IEnumerable(Of XElement) = _
            From el In root.<aw:PurchaseOrder> _
            Where _
                (From add In el.<aw:Address> _
                Where _
                     add.@aw:Type = "Shipping" And _
                     add.<aw:State>.Value = "NY" _
                Select add) _
            .Any() _
            Select el
        For Each el As XElement In purchaseOrders
            Console.WriteLine(el.@aw:PurchaseOrderNumber)
        Next
    End Sub
End Module

Det här exemplet genererar följande utdata:

99505

Se även