Opérations de requête de base (Visual Basic)

Cette rubrique présente brièvement les expressions LINQ (Language Integrated Query) dans Visual Basic et certains types d'opérations classiques effectués dans une requête.Pour plus d'informations, consultez les rubriques suivantes :

Introduction à LINQ dans Visual Basic

Requêtes (Visual Basic)

Procédure pas à pas : écriture de requêtes dans Visual Basic

Spécification de la source de données (From)

Dans une requête LINQ, la première étape consiste à spécifier la source de données à interroger.Par conséquent, la clause d' From dans une requête est toujours en premier. Les opérateurs de requête et sélectionnez façonnent le résultat selon le type de la source.

Dim query = From cust In customers
'           ...

La clause From spécifie la source de données (customers) et une variable de portée (cust).La variable de portée est similaire à une variable d'itération de boucle, à la différence que dans une expression de requête, aucune itération réelle ne se produit.Lorsque la requête est exécutée, souvent à l'aide d'une boucle For Each, la variable de portée sert de référence à chaque élément consécutif dans customers.Étant donné que le compilateur peut déduire le type de cust, vous n'avez pas à le spécifier explicitement.Pour obtenir des exemples de requêtes écrites avec et sans type explicite, consultez Relations des types dans des opérations de requête (Visual Basic).

Pour plus d'informations sur l'utilisation de la clause From dans Visual Basic, consultez From, clause (Visual Basic).

Filtrage de données (Where)

L'opération de requête la plus courante est probablement l'application d'un filtre sous forme d'expression booléenne.La requête retourne alors uniquement les éléments pour lesquels l'expression a la valeur true.Une clause Where est utilisée pour effectuer le filtrage.Le filtre spécifie les éléments de la source de données à inclure dans la séquence résultante.Dans l'exemple suivant, seuls les clients qui ont une adresse à Londres (London) sont inclus.

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

Vous pouvez utiliser des opérateurs logiques tels que And et Or pour associer des expressions de filtre dans une clause Where.Par exemple, pour retourner uniquement les clients de Londres et dont le nom est Devon, utilisez le code suivant :

Where cust.City = "London" And cust.Name = "Devon" 

Pour retourner les clients de Londres ou de Paris, utilisez le code suivant :

Where cust.City = "London" Or cust.City = "Paris" 

Pour plus d'informations sur l'utilisation de la clause Where dans Visual Basic, consultez Where, clause (Visual Basic).

Classement de données (Order By)

Il est souvent pratique de trier les données retournées dans un ordre spécifique.La clause Order By permet de trier les éléments de la séquence retournée selon un ou plusieurs champs spécifiés.Par exemple, la requête suivante trie les résultats selon la propriété Name.Étant donné que Name est une chaîne, les données retournées seront triées par ordre alphabétique, de A à Z.

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

Pour classer les résultats dans l'ordre inverse, de Z à A, utilisez la clause Order By...Descending.La valeur par défaut est Ascending lorsque ni Ascending, ni Descending ne sont spécifiés.

Pour plus d'informations sur l'utilisation de la clause Order By dans Visual Basic, consultez Order By, clause (Visual Basic).

Sélection de données (Select)

La clause Select spécifie la forme et le contenu d'éléments retournés.Par exemple, vous pouvez spécifier si vos résultats se composeront d'objets Customer complets, d'une seule propriété Customer, d'un sous-ensemble de propriétés, d'une combinaison de propriétés de sources de données diverses ou d'un nouveau type de résultat basé sur un calcul.Lorsque la clause Select produit autre chose qu'une copie de l'élément source, l'opération est appelée projection.

Pour récupérer une collection qui se compose d'objets Customer complets, sélectionnez la variable de portée elle-même :

Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust

Si une instance de Customer est un objet volumineux comportant de nombreux champs et que vous souhaitez uniquement récupérer le nom, vous pouvez sélectionner cust.Name, comme indiqué dans l'exemple suivant.L'inférence de type de variable locale reconnaît que cela modifie le type de résultat d'une collection d'objets Customer en une collection de chaînes.

Dim londonCusts3 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust.Name

Pour sélectionner plusieurs champs de la source de données, vous avez deux possibilités :

  • Dans la clause Select, spécifiez les champs que vous souhaitez inclure dans le résultat.Le compilateur définira un type anonyme dont ces champs constituent les propriétés.Pour plus d'informations, consultez Types anonymes (Visual Basic).

    Étant donné que les éléments retournés dans l'exemple suivant sont des instances d'un type anonyme, vous ne pouvez pas faire référence au type par son nom ailleurs dans votre code.Le nom désigné par le compilateur pour le type contient des caractères qui ne sont pas valides dans le code Visual Basic normal.Dans l'exemple suivant, les éléments de la collection retournée par la requête dans londonCusts4 sont des instances d'un type anonyme.

            Dim londonCusts4 = From cust In customers
                               Where cust.City = "London"
                               Order By cust.Name Ascending
                               Select Name = cust.Name, Phone = cust.Phone
    
            For Each londonCust In londonCusts4
                Console.WriteLine(londonCust.Name & " " & londonCust.Phone)
            Next
    
    

    ou

  • Définissez un type nommé qui contient les champs spécifiques à inclure dans le résultat, puis créez et initialisez des instances du type dans la clause Select.Utilisez cette option uniquement si vous devez utiliser des résultats individuels en dehors de la collection dans laquelle ils sont retournés ou si vous devez les passer comme paramètres dans des appels de méthode.Dans l'exemple suivant, le type de londonCusts5 est IEnumerable (Of NamePhone).

    Public Class NamePhone
        Public Name As String
        Public Phone As String
        ' Additional class elements
    End Class
    
    Dim londonCusts5 = From cust In customers
                       Where cust.City = "London"
                       Order By cust.Name Ascending
                       Select New NamePhone With {.Name = cust.Name,
                                                  .Phone = cust.Phone}
    

Pour plus d'informations sur l'utilisation de la clause Select dans Visual Basic, consultez Select, clause (Visual Basic).

Jointure de données (Join et Group Join)

Vous pouvez associer plusieurs sources de données dans la clause From de diverses façons.Par exemple, le code suivant utilise deux sources de données et associe implicitement les propriétés des deux dans le résultat.La requête sélectionne les étudiants dont le nom commence par une voyelle.

Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
                 Where student.Last.IndexOf(vowel) = 0
                 Select Name = student.First & " " &
                 student.Last, Initial = vowel
                 Order By Initial

For Each vName In vowelNames
    Console.WriteLine(vName.Initial & ":  " & vName.Name)
Next

[!REMARQUE]

Vous pouvez exécuter ce code avec la liste d'étudiants créée dans Comment : créer une liste d'éléments.

Le mot clé Join est équivalent à INNER JOIN dans SQL.Il associe deux collections basées sur des valeurs de clés correspondantes entre les éléments des deux collections.La requête retourne tout ou partie des éléments de la collection qui ont des valeurs de clés correspondantes.Par exemple, le code suivant duplique l'action de la jointure implicite précédente.

Dim vowelNames2 = From student In students
                  Join vowel In vowels
                  On student.Last(0) Equals vowel
                  Select Name = student.First & " " &
                  student.Last, Initial = vowel
                  Order By Initial

Group Join rassemble des collections dans une collection hiérarchique unique, tout comme LEFT JOIN dans SQL.Pour plus d'informations, consultez Join, clause (Visual Basic) et Group Join, clause (Visual Basic).

Regroupement de données (Group By)

Vous pouvez ajouter une clause Group By pour regrouper les éléments d'un résultat de requête d'après un ou plusieurs champs des éléments.Par exemple, le code suivant regroupe les étudiants par année de classe.

Dim studentsByYear = From student In students
                     Select student
                     Group By year = student.Year
                     Into Classes = Group

For Each yearGroup In studentsByYear
    Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
    For Each student In yearGroup.Classes
        Console.WriteLine("   " & student.Last & ", " & student.First)
    Next
Next

Si vous exécutez ce code à l'aide de la liste d'étudiants créée dans Comment : créer une liste d'éléments, la sortie de l'instruction For Each est la suivante :

Year: Junior (Année : 1re)

    Tucker, Michael

    Garcia, Hugo

    Garcia, Debra

    Tucker, Lance

    

Year: Senior (Année : Terminale)

    Omelchenko, Svetlana

    Osada, Michiko

    Fakhouri, Fadi

    Feng, Hanying

    Adams, Terry

    

Year: Freshman (Année : 3e)

    Mortensen, Sven

    Garcia, Cesar

La variante indiquée dans le code suivant trie les années de classe, puis trie les étudiants de chaque année par nom.

Dim studentsByYear2 = From student In students
                      Select student
                      Order By student.Year, student.Last
                      Group By year = student.Year
                      Into Classes = Group

Pour plus d'informations sur Group By, consultez Group By, clause (Visual Basic).

Voir aussi

Référence

IEnumerable<T>

Concepts

Vue d'ensemble des opérateurs de requête standard

Opérations de requête LINQ de base (C#)

Autres ressources

Mise en route de LINQ dans Visual Basic

Requêtes (Visual Basic)

LINQ en Visual Basic