Partager via


Procédure : écrire des requêtes avec un filtrage complexe

Mise à jour : November 2007

Il peut arriver que vous souhaitiez écrire des requêtes LINQ to XML à l'aide de filtres complexes. Par exemple, il se peut que vous deviez rechercher tous les éléments qui ont un élément enfant avec un nom et une valeur spécifiques. Cette rubrique fournit un exemple d'écriture de requête avec un filtrage complexe.

Exemple

Cet exemple montre comment rechercher tous les éléments PurchaseOrder qui ont un élément Address enfant ayant un attribut Type égal à « Shipping » et un élément State enfant égal à « NY ». Il utilise une sous-requête dans la clause Where et l'opérateur Any retourne true si la collection possède des éléments. Pour plus d'informations sur l'utilisation de la syntaxe de requête fondée sur une méthode, consultez Comparaison de la syntaxe de requête et de la syntaxe de méthode (LINQ).

Cet exemple utilise le document XML suivant : Exemple de fichier XML : Plusieurs commandes fournisseur (LINQ to XML).

Pour plus d'informations sur l'opérateur Any, consultez Opérations de quantificateur.

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

Ce code génère la sortie suivante :

99505

L'exemple suivant illustre la même requête pour du code XML qui est dans un espace de noms. Pour plus d'informations, consultez Utilisation des espaces de noms XML.

Cet exemple utilise le document XML suivant : Exemple de fichier XML : Plusieurs commandes fournisseur dans un espace de noms.

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

Ce code génère la sortie suivante :

99505

Voir aussi

Concepts

Requêtes de base (LINQ to XML)

Opérations de quantificateur

Opérations de projection

Référence

Propriété d'axe enfant XML

Propriété d'axe d'attribut XML

Propriété de valeur XML

Attribute

Elements