Condividi tramite


Procedura: scrivere query con filtri complessi

A volte si desidera scrivere query LINQ to XML con filtri complessi. Può ad esempio essere necessario trovare tutti gli elementi che hanno un elemento figlio con un determinato nome e valore. In questo argomento viene illustrato come scrivere una query di esempio con filtri complessi.

Esempio

Nell'esempio viene illustrato come trovare tutti gli elementi PurchaseOrder che includono un elemento figlio Address con un attributo Type uguale a "Shipping" e un elemento figlio State uguale a "NY". Viene usata una query annidata nella clausola Where e l'operatore Any restituisce true se la raccolta contiene elementi. Per informazioni sull'utilizzo della sintassi delle query basate su metodo, vedere Sintassi di query e sintassi di metodi in LINQ (C#).

Nell'esempio viene usato il seguente documento XML: File XML di esempio: Multiple Purchase Orders (LINQ to XML)

Per altre informazioni sull'operatore Any, vedere Operazioni del quantificatore.

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

L'output del codice è il seguente:

99505

Nell'esempio seguente è illustrata la stessa query per XML in uno spazio dei nomi. Per altre informazioni, vedere Utilizzo degli spazi dei nomi XML.

Nell'esempio viene usato il seguente documento XML: File XML di esempio: Multiple Purchase Orders in a Namespace

XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "https://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='https://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

L'output del codice è il seguente:

99505

Vedere anche

Riferimenti

Proprietà Child Axis XML (Visual Basic)

Proprietà axis dell'attributo XML (Visual Basic)

Proprietà Value XML (Visual Basic)

Attribute

Elements

Concetti

Query di base (LINQ to XML)

Operazioni del quantificatore

Operazioni di proiezione