Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Cette procédure pas à pas montre comment utiliser des fonctionnalités de langage Visual Basic pour écrire des expressions de requête LINQ (Language-Integrated Query). La procédure pas à pas montre comment créer des requêtes sur une liste d’objets Student, comment exécuter les requêtes et comment les modifier. Les requêtes incorporent plusieurs fonctionnalités, notamment les initialiseurs d’objet, 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 incluent LINQ to SQL, LINQ to DataSet et LINQ to XML.
Créer un projet
Pour créer un projet d’application console
Démarrez Visual Studio.
Dans le menu Fichier , pointez sur Nouveau, puis cliquez sur Projet.
Dans la liste Modèles installés , cliquez sur Visual Basic.
Dans la liste des types de projets, cliquez sur Application console. Dans la zone Nom , tapez un nom pour le projet, puis cliquez sur OK.
Un projet est créé. Par défaut, il contient une référence à System.Core.dll. En outre, la liste des espaces de noms importés dans la page Références, Le Concepteur de projets (Visual Basic) inclut l’espace System.Linq de noms.
Dans la page Compiler, le Concepteur de projets (Visual Basic), vérifiez que l’option déduite est activée.
Ajouter une source de données In-Memory
La source de données des requêtes de cette procédure pas à pas est une liste d’objets Student . Chaque Student objet contient un prénom, un nom, une année de classe et un rang académique dans le corps de l’étudiant.
Pour ajouter la source de données
Définissez une
Studentclasse et créez une liste d’instances de la classe.Important
Le code nécessaire pour définir la
Studentclasse et créer la liste utilisée dans les exemples de procédure pas à pas est fourni dans How to : Create a List of Items. Vous pouvez le copier à partir de là et le coller dans votre projet. Le nouveau code remplace le code qui apparaît lors de la création du projet.
Pour ajouter un nouvel étudiant à la liste des étudiants
- Suivez le modèle de la
getStudentsméthode pour ajouter une autre instance de laStudentclasse à la liste. L’ajout de l’étudiant vous présente les initialiseurs d’objet. Pour plus d’informations, consultez Initialiseurs d’objets : Types nommés et anonymes.
Créer une requête
Lorsqu’elle est exécutée, la requête ajoutée dans cette section génère une liste des étudiants dont le rang académique les place dans les dix premiers. Étant donné que la requête sélectionne l’objet complet Student chaque fois, 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. Au lieu de cela, le compilateur utilise l’inférence de type local pour déterminer le type. Pour plus d’informations, consultez l’inférence de type local. La variable de plage de la requête, currentStudentsert de référence à chaque Student instance de la source, studentsen fournissant l’accès aux propriétés de chaque objet dans students.
Pour créer une requête simple
Recherchez l’emplacement dans la
Mainméthode 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 currentStudentPlacez le pointeur
studentQueryde la souris sur votre code pour vérifier que le type attribué par le compilateur estIEnumerable(Of Student).
Exécuter la requête
La variable studentQuery contient la définition de la requête, et non les résultats de l’exécution de la requête. Un mécanisme classique d’exécution d’une requête est une For Each boucle. 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 des requêtes, consultez Écriture de votre première requête LINQ.
Pour exécuter la requête
Ajoutez la boucle suivante
For Eachsous la requête dans votre projet.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) NextPlacez le pointeur de la souris sur la variable
studentRecordde contrôle de boucle pour voir son type de données. Le type d’instance est déduitStudent, carstudentQueryretourne une collection d’instancesStudent.studentRecordGé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 les résultats de requête s’ils sont dans un ordre spécifié. Vous pouvez trier la séquence retournée en fonction de n’importe quel champ disponible.
Pour classer les résultats
Ajoutez la clause suivante
Order Byentre l’instructionWhereet l’instructionSelectde la requête. LaOrder Byclause trie les résultats par ordre alphabétique entre A et Z, en fonction du nom de chaque étudiant.Order By currentStudent.Last AscendingPour commander par nom, puis prénom, ajoutez les deux champs à la requête :
Order By currentStudent.Last Ascending, currentStudent.First AscendingVous pouvez également spécifier
Descendingl’ordre entre Z et A.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
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,
nameil s’agit d’un identificateur qui contient une concaténation des prénoms et noms de l’étudiant. Un identificateur local peut être utilisé pour des raisons pratiques, ou il peut améliorer les performances en stockant les résultats d’une expression qui serait autrement 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) NextGé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
Ajoutez la requête et
For Eachla boucle de cette section pour créer une requête qui produit une séquence dont les éléments diffèrent des éléments de la source. Dans l’exemple suivant, la source est une collection d’objetsStudent, mais un seul membre de chaque objet est retourné : le prénom des étudiants dont le nom est Garcia. Étant donné qu’ilcurrentStudent.Firsts’agit d’une chaîne, le type de données de la séquence retournée eststudentQuery3IEnumerable(Of String), une séquence de chaînes. Comme dans les exemples précédents, l’affectation d’un type de données eststudentQuery3laissée au compilateur pour déterminer à 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) NextPlacez le pointeur
studentQuery3de la souris sur votre code pour vérifier que le type attribué estIEnumerable(Of String).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
Ajoutez le code de cette section pour voir comment les types anonymes sont utilisés dans les requêtes. Vous les utilisez dans les requêtes lorsque vous souhaitez retourner plusieurs champs de la source de données plutôt que des enregistrements complets (
currentStudentenregistrements dans des exemples précédents) ou des champs uniques (Firstdans 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 de laSelectclause et le compilateur crée un type anonyme avec ces champs comme propriétés. Pour plus d’informations, consultez Types anonymes.L’exemple suivant crée une requête qui retourne le nom et le rang des aînés dont le rang scolaire est compris entre 1 et 10, dans l’ordre de classement universitaire. Dans cet exemple, le type de
studentQuery4fichier doit être déduit, car laSelectclause 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) NextGé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 comprenez les principes de base, voici une liste d’exemples supplémentaires pour illustrer la flexibilité et la puissance des requêtes LINQ. Chaque exemple est précédé d’une brève description de ce qu’il fait. Placez le pointeur de la souris sur la variable de résultat de la requête pour chaque requête pour voir le type déduit. Utilisez une For Each boucle pour produire 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 connaissez les concepts de base de l’utilisation des requêtes, vous êtes prêt à lire la documentation et les exemples pour le type spécifique de fournisseur LINQ qui vous intéresse :