Vorgehensweise: Schreiben von Abfragen mit komplexer Filterung (C#)

Es kann vorkommen, dass Sie LINQ to XML-Abfragen mit komplexen Filtern schreiben möchten. Vielleicht möchten Sie z. B. auf diese Weise nach allen Elementen suchen, die ein untergeordnetes Element mit einem bestimmten Namen und einem bestimmten Wert besitzen. In diesem Thema finden Sie ein Beispiel für das Schreiben von Fragen mit komplexer Filterung.

Beispiel

Dieses Beispiel zeigt, wie Sie nach allen PurchaseOrder-Elementen suchen können, die ein untergeordnetes Address-Element mit einem Type-Attribut "Shipping" und einem untergeordneten State-Element "NY" besitzen. Das Beispiel verwendet eine geschachtelte Abfrage in der Where-Klausel, und der Any-Operator gibt true zurück, sofern die Auflistung überhaupt Elemente enthält. Weitere Informationen zu methodenbasierter Abfragesyntax finden Sie unter Abfragesyntax und Methodensyntax in LINQ.

Dieses Beispiel verwendet das folgende XML-Dokument: Beispiel-XML-Datei: mehrfache Bestellung (LINQ to XML).

Weitere Informationen zum Any-Operator finden Sie unter Quantifier Operations (C#) (Quantifizierervorgänge (C#)).

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"));  

Dieser Code erzeugt die folgende Ausgabe:

99505  

Beispiel

Im folgenden Beispiel wird dieselbe Abfrage für XML in einem Namespace gezeigt. Weitere Informationen finden Sie unter Working with XML Namespaces (C#) (Arbeiten mit XML-Namespaces (C#)).

Dieses Beispiel verwendet das folgende XML-Dokument: Beispiel-XML-Datei: mehrfache Bestellung in einem Namespace.

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"));  

Dieser Code erzeugt die folgende Ausgabe:

99505  

Siehe auch

Attribute
Elements
Basic Queries (LINQ to XML) (C#) (Standardabfragen (LINQ to XML) (C#))
Projektionsvorgänge (C#)
Quantifizierer-Vorgänge (C#)