Partager via


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

Mise à jour : novembre 2007

Cette procédure pas à pas vous guide à travers les nouvelles fonctionnalités de langage Visual Basic 2008 et illustre leur utilisation pour l'écriture d'expressions de requête LINQ (Language Integrated Query). La procédure pas à pas indique comment créer des requêtes dans une liste d'objets Student, comment exécuter les requêtes et comment les modifier. Les requêtes incorporent plusieurs nouvelles fonctionnalités de Visual Basic 2008, y compris les initialiseurs d'objets, l'inférence de type local et les types anonymes.

Une fois cette procédure pas à pas terminée, vous serez prêt à passer aux exemples et à la documentation du fournisseur LINQ spécifique qui vous intéresse. Les fournisseurs LINQ comprennent LINQ to SQL, LINQ to DataSet et LINQ to XML.

lien vers la vidéo Pour une présentation vidéo, consultez la page Vidéo : Comment écrire des requêtes en Visual Basic.

Créer un projet

Pour créer un projet qui cible la version 3.5 ou ultérieure du .NET Framework

  1. Démarrez Visual Studio 2008.

  2. Dans le menu Fichier, cliquez sur Nouveau projet.

  3. Cliquez sur Application console, puis sur OK.

    Un projet est créé. Par défaut, il contient une référence à System.Core.dll et une instruction Imports pour l'espace de noms System.Linq, toutes deux nécessaires à l'exécution de requêtes LINQ.

Ajouter une source de données en mémoire

La source de données pour les requêtes de cette procédure pas à pas est une liste d'objets Student. Chaque objet Student contient un prénom, un nom, une année de classe et un classement dans le corps Student.

Pour ajouter la source de données

  • Définissez une classe Student et créez une liste d'instances de la classe.

    Remarque importante :

    Le code requis pour définir la classe Student et créer la liste utilisée dans les exemples de la procédure pas à pas est fourni dans Comment : créer une liste d'éléments. Vous pouvez le copier et le coller dans votre projet. Le nouveau code remplace le code qui est apparu lorsque vous avez créé le projet.

Pour ajouter un nouvel étudiant à la liste des étudiants

  • Suivez le modèle dans la méthode getStudents pour ajouter une autre instance de la classe Student à la liste. L'ajout de l'étudiant vous permet de découvrir les initialiseurs d'objets, une nouveauté de Visual Basic 2008. Pour plus d'informations, consultez Initialiseurs d'objets : types nommés et anonymes.

Créer une requête

Lors de son exécution, la requête ajoutée dans cette section génère la liste des étudiants qui sont les dix premiers dans le classement. Étant donné que la requête sélectionne à chaque fois l'objet Student complet, le type du résultat de la requête est IEnumerable(Of Student). Toutefois, le type de la requête n'est généralement pas spécifié dans les définitions de requête. À la place, le compilateur utilise l'inférence de type local pour déterminer le type. Pour plus d'informations, consultez Inférence de type local. La variable de portée de la requête, currentStudent, sert de référence à chaque instance Student dans la source, students, en fournissant l'accès aux propriétés de chaque objet dans students.

Pour créer une requête simple

  1. Recherchez l'endroit dans la méthode Main du projet marqué comme suit :

    ' ****Paste query and query execution code from the walkthrough,
    ' ****or any code of your own, here in Main.
    

    Copiez le code suivant et collez-le.

    Dim studentQuery = From currentStudent In students _
                       Where currentStudent.Rank <= 10 _
                       Select currentStudent
    
  2. Placez le pointeur de la souris sur studentQuery dans votre code pour vérifier que le type assigné par le compilateur est IEnumerable(Of Student).

Exécuter la requête

La variable studentQuery contient la définition de la requête mais ne contient pas les résultats de l'exécution de la requête. Une boucle For Each est un mécanisme classique pour exécuter une requête. Chaque élément de la séquence retournée est accessible via la variable d'itération de boucle. Pour plus d'informations sur l'exécution de la requête, consultez Écriture de votre première requête LINQ (Visual Basic).

Pour exécuter la requête

  1. Ajoutez la boucle For Each suivante sous la requête dans votre projet.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Placez le pointeur de la souris sur la variable de contrôle de boucle studentRecord pour consulter son type de données. Le type de studentRecord, Student, est déduit car studentQuery retourne une collection d'instances Student.

  3. Générez et exécutez l'application en appuyant sur CTRL+F5. Notez les résultats dans la fenêtre de console.

Modifier la requête

Il est plus facile d'analyser des résultats de requête s'ils sont dans un ordre spécifié. Vous pouvez trier la séquence retournée à partir de n'importe quel champ disponible.

Pour classer les résultats

  1. Ajoutez la clause Order By suivante entre l'instruction Where et l'instruction Select de la requête. La clause Order By classera les résultats en ordre alphabétique de A à Z, d'après le nom de chaque étudiant.

    Order By currentStudent.Last Ascending _
    
  2. Pour classer par nom puis par prénom, ajoutez les deux champs à la requête :

    Order By currentStudent.Last Ascending, currentStudent.First Ascending _
    

    Vous pouvez également spécifier Descending pour classer de Z à A.

  3. Générez et exécutez l'application en appuyant sur CTRL+F5. Notez les résultats dans la fenêtre de console.

Pour introduire un identificateur local

  1. Ajoutez le code de cette section pour introduire un identificateur local dans l'expression de requête. L'identificateur local contiendra un résultat intermédiaire. Dans l'exemple suivant, name est un identificateur qui contient une concaténation du nom et du prénom de l'étudiant. Un identificateur local peut être utilisé pour des raisons pratiques ou peut améliorer les performances en stockant les résultats d'une expression qui, sinon, serait calculée plusieurs fois.

    Dim studentQuery2 = _
            From currentStudent In students _
            Let name = currentStudent.Last & ", " & currentStudent.First _
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10 _
            Order By name Ascending _
            Select currentStudent
    
    ' If you see too many results, comment out the previous
    ' For Each loop.
    For Each studentRecord In studentQuery2
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Générez et exécutez l'application en appuyant sur CTRL+F5. Notez les résultats dans la fenêtre de console.

Pour projeter un champ dans la clause Select

  1. Ajoutez la requête et la boucle For Each de cette section pour créer une requête qui génère une séquence dont les éléments diffèrent des éléments dans la source. Dans l'exemple suivant, la source est une collection d'objets Student, mais un seul membre de chaque objet est retourné : le prénom des étudiants dont le nom est Garcia. Étant donné que currentStudent.First est une chaîne, le type de données de la séquence retournée par studentQuery3 est IEnumerable(Of String), une séquence de chaînes. Comme dans les exemples précédents, l'assignation d'un type de données à studentQuery3 est effectuée par le compilateur à l'aide de l'inférence de type local.

    Dim studentQuery3 = From currentStudent In students _
                        Where currentStudent.Last = "Garcia" _
                        Select currentStudent.First
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery3
        Console.WriteLine(studentRecord)
    Next
    
  2. Placez le pointeur de la souris sur studentQuery3 dans votre code pour vérifier que le type assigné est IEnumerable(Of String).

  3. Générez et exécutez l'application en appuyant sur CTRL+F5. Notez les résultats dans la fenêtre de console.

Pour créer un type anonyme dans la clause Select

  1. Ajoutez le code de cette section pour voir comment les types anonymes sont utilisés dans les requêtes. Les types anonymes sont une nouvelle fonctionnalité de Visual Basic 2008. Utilisez-les dans les requêtes lorsque vous souhaitez retourner plusieurs champs de la source de données plutôt que des enregistrements complets (enregistrements currentStudent dans les exemples précédents) ou des champs uniques (First dans la section précédente). Au lieu de définir un nouveau type nommé qui contient les champs que vous souhaitez inclure dans le résultat, vous spécifiez les champs dans la clause Select et le compilateur crée un type anonyme dont ces champs sont les propriétés. Pour plus d'informations, consultez Types anonymes.

    L'exemple suivant crée une requête qui retourne le nom et le classement dans l'ordre des dix étudiants les mieux classés. Dans cet exemple, le type de studentQuery4 doit être déduit car la clause Select retourne une instance d'un type anonyme, et un type anonyme n'a pas de nom utilisable.

    Dim studentQuery4 = _
            From currentStudent In students _
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10 _
            Order By currentStudent.Rank Ascending _
            Select currentStudent.First, currentStudent.Last, currentStudent.Rank
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery4
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First & _
                          ":  " & studentRecord.Rank)
    Next
    
  2. Générez et exécutez l'application en appuyant sur CTRL+F5. Notez les résultats dans la fenêtre de console.

Exemples supplémentaires

Maintenant que vous avez assimilé les éléments fondamentaux, voici une liste d'exemples supplémentaires pour illustrer la souplesse et la puissance des requêtes LINQ. Chaque exemple est précédé d'une brève description de leur fonction. Placez le pointeur de la souris sur la variable de résultat de chaque requête pour consulter le type déduit. Utilisez une boucle For Each pour générer les résultats.

' Find all students who are seniors.
Dim q1 = From currentStudent In students _
         Where currentStudent.Year = "Senior" _
         Select currentStudent

' Write a For Each loop to execute the query.
For Each q In q1
    Console.WriteLine(q.First & " " & q.Last)
Next

' Find all students with a first name beginning with "C".
Dim q2 = From currentStudent In students _
         Where currentStudent.First.StartsWith("C") _
         Select currentStudent

' Find all top ranked seniors (rank < 40).
Dim q3 = From currentStudent In students _
         Where currentStudent.Rank < 40 And currentStudent.Year = "Senior" _
         Select currentStudent

' Find all seniors with a lower rank than a student who 
' is not a senior.
Dim q4 = From student1 In students, student2 In students _
         Where student1.Year = "Senior" And student2.Year <> "Senior" And _
               student1.Rank > student2.Rank _
         Select student1 _
         Distinct

' Retrieve the full names of all students, sorted by last name.
Dim q5 = From currentStudent In students _
         Order By currentStudent.Last _
         Select Name = currentStudent.First & " " & currentStudent.Last

' Determine how many students are ranked in the top 20.
Dim q6 = Aggregate currentStudent In students _
         Where currentStudent.Rank <= 20 _
         Into Count()

' Count the number of different last names in the group of students.
Dim q7 = Aggregate currentStudent In students _
         Select currentStudent.Last _
         Distinct _
         Into Count()

' Create a list box to show the last names of students.
Dim lb As New System.Windows.Forms.ListBox
Dim q8 = From currentStudent In students _
         Order By currentStudent.Last _
         Select currentStudent.Last Distinct

For Each nextName As String In q8
    lb.Items.Add(nextName)
Next

' Find every process that has a lowercase "h", "l", or "d" in its name.
Dim letters() As String = {"h", "l", "d"}
Dim q9 = From proc In System.Diagnostics.Process.GetProcesses, _
         letter In letters _
         Where proc.ProcessName.Contains(letter) _
         Select proc

For Each proc In q9
    Console.WriteLine(proc.ProcessName & ", " & proc.WorkingSet64)
Next

Informations supplémentaires

Une fois que vous vous êtes familiarisé avec les concepts de base relatifs à l'utilisation des requêtes, vous pouvez consulter la documentation et les exemples pour le type spécifique de fournisseur LINQ qui vous intéresse :

LINQ to Objects

LINQ to SQL

LINQ to XML

LINQ to DataSet

Voir aussi

Tâches

Exemples de requêtes (Visual Basic)

Concepts

Ressources LINQ supplémentaires

Inférence de type local

Initialiseurs d'objets : types nommés et anonymes

Types anonymes

Introduction à LINQ dans Visual Basic

Autres ressources

LINQ (Language-Integrated Query)

Mise en route de LINQ dans Visual Basic

LINQ en Visual Basic

Requêtes (Visual Basic)