Opérations de requête de base (Visual Basic)
Cette rubrique fournit une brève introduction aux expressions LINQ (Language-Integrated Query) dans Visual Basic, et à certains des types d’opérations classiques que vous effectuez dans une requête. Pour plus d'informations, voir les rubriques suivantes :
Introduction à LINQ en 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 From
d’une requête est toujours disponible en premier. Les opérateurs de requête sélectionnent et forment le résultat en fonction du 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 plage, cust
. La variable de plage est semblable à une variable d’itération de boucle, sauf 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 plage sert de référence à chaque élément successif dans customers
. Comme le compilateur déduit le type de cust
, vous n’avez pas à le spécifier explicitement. Pour obtenir des exemples de requêtes écrites avec et sans saisie explicite, consultez Relations de types dans les opérations de requête (Visual Basic).
Pour plus d’informations sur l’utilisation de la clause From
dans Visual Basic, consultez Clause From.
Filtrage des 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 ensuite uniquement les éléments pour lesquels l’expression est vraie. 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 ayant une adresse à Londres 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 combiner des expressions de filtre dans une clause Where
. Par exemple, pour renvoyer uniquement les clients de Londres et dont le nom est Devon, utilisez le code suivant :
Where cust.City = "London" And cust.Name = "Devon"
Pour renvoyer des 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 Clause Where.
Classement des données (Order by)
Il est souvent pratique de trier les données retournées dans un ordre particulier. La clause Order By
entraîne le tri des éléments de la séquence retournée sur un champ ou des champs spécifiés. Par exemple, la requête suivante trie les résultats en fonction de la propriété Name
. Étant donné que Name
est une chaîne, les données retournées sont 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 trier les résultats dans l’ordre inverse, de Z à A, utilisez la clause Order By...Descending
. La valeur par défaut est Ascending
quand ni Ascending
ni Descending
n’est spécifié.
Pour plus d’informations sur l’utilisation de la clause Order By
dans Visual Basic, consultez Clause Order By.
Sélection de données (Select)
La clause Select
spécifie la forme et le contenu des éléments retournés. Par exemple, vous pouvez spécifier si vos résultats doivent se composer d’objets complets Customer
, d’une seule propriété Customer
, d’un sous-ensemble de propriétés, d’une combinaison de propriétés provenant de différentes sources de données ou d’un nouveau type de résultat basé sur un calcul. Quand 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 composée d’objets complets Customer
, sélectionnez la variable de plage concernée :
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Si une instance Customer
est un objet volumineux qui a de nombreux champs et que vous souhaitez en récupérer le nom, vous pouvez sélectionner cust.Name
, comme illustré dans l’exemple suivant. L’inférence de type local 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 dans la source de données, vous avez deux choix :
Dans la clause
Select
, spécifiez les champs que vous souhaitez inclure dans le résultat. Le compilateur définit un type anonyme ayant ces champs comme propriétés. Pour plus d’informations, consultez Types anonymes.Étant donné que les éléments retournés dans l’exemple suivant sont des instances de type anonyme, vous ne pouvez pas faire référence au type par 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és par la requête
londonCusts4
sont des instances de type anonymeDim 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é contenant les champs que vous souhaitez 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 transmettre en tant que paramètres dans les appels de méthode. Le type delondonCusts5
de l’exemple suivant 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 Sélectionner une clause.
Jointure de données (Join et Group Join)
Vous pouvez combiner plusieurs sources de données dans la clause From
de plusieurs façons. Par exemple, le code suivant utilise deux sources de données et combine implicitement les propriétés de chacune 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
Notes
Vous pouvez exécuter ce code avec la liste des étudiants créée dans Comment créer une liste d'éléments.
Dans SQL, le mot-clé Join
est équivalent à un mot-clé INNER JOIN
. Il combine deux collections basées sur des valeurs de clés correspondantes entre les éléments des deux collections. La requête retourne tous ou une partie des éléments de collection ayant 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
combine des collections en une seule collection hiérarchique, comme LEFT JOIN
dans SQL. Pour plus d’informations, consultez Clause Join etClause Group Join.
Regroupement de données (Group by)
Vous pouvez ajouter une clause Group By
pour regrouper les éléments dans un résultat de requête en fonction d’un ou de plusieurs champs d’éléments. Par exemple, le code suivant regroupe les étudiants par 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 des étudiants créés dans Comment créer une liste d'éléments, la sortie de l’instruction For Each
sera :
Classe : Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Classe : Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Année : Freshman
Mortensen, Sven
Garcia, Cesar
La variation indiquée dans le code suivant commande les classes, puis commande les étudiants de chaque classe 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 Clause Group By.