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
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
Notes
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
Concepts
Vue d'ensemble des opérateurs de requête standard
Opérations de requête LINQ de base (C#)