Fonctionnalités Visual Basic prenant en charge LINQ
Le nom LINQ (Language Integrated Query) fait référence à la technologie dans Visual Basic qui prend en charge la syntaxe de requête et d'autres constructions de langage directement dans le langage. Avec LINQ, vous n'avez pas à apprendre un nouveau langage pour exécuter une requête sur une source de données externe. Vous pouvez exécuter une requête sur les données de bases de données relationnelles, de magasins XML ou d'objets à l'aide de Visual Basic. Cette intégration de fonctions de requête dans le langage active le contrôle de compilation pour les erreurs de syntaxe et la cohérence des types. Grâce à cette intégration, vous avez pratiquement toutes les connaissances nécessaires pour écrire des requêtes puissantes et variées dans Visual Basic.
Les sections suivantes décrivent les constructions de langage qui prennent en charge LINQ de manière suffisamment détaillée pour vous permettre de lire les documentations d'introduction, les exemples de code et les applications d'exemple. Vous pouvez également cliquer sur les liens pour consulter des explications plus détaillées sur la manière dont les fonctionnalités de langage se combinent pour activer LINQ (Language-Integrated Query). Il est conseillé de commencer par Procédure pas à pas : écriture de requêtes dans Visual Basic.
Expressions de requête
Les expressions de requête dans Visual Basic peuvent être exprimées dans une syntaxe déclarative semblable à celle de SQL ou de XQuery. Lors de la compilation, la syntaxe de requête est convertie en appels de méthode à l'implémentation d'un fournisseur LINQ des méthodes d'extension d'opérateur de requête standard. Les applications déterminent les opérateurs de requête standard qui sont dans la portée en spécifiant l'espace de noms approprié avec une instruction Imports. La syntaxe pour une expression de requête Visual Basic se présente sous la forme suivante :
Dim londonCusts = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name, cust.Phone
Pour plus d'informations, consultez Introduction à LINQ dans Visual Basic.
Variables implicitement typées
Au lieu de spécifier un type explicitement lorsque vous déclarez et initialisez une variable, vous pouvez maintenant permettre au compilateur de déduire et d'assigner le type. Cette opération est dénommée inférence de type locale.
Les variables dont les types sont déduits sont fortement typées, comme les variables dont vous spécifiez le type de manière explicite. L'inférence de type locale fonctionne uniquement lorsque vous définissez une variable locale à l'intérieur d'un corps de méthode. Pour plus d'informations, consultez Instruction Option Infer et Inférence de type local (Visual Basic).
L'exemple suivant illustre l'inférence de type locale. Pour utiliser cet exemple, vous devez affecter à Option Infer la valeur On.
' The variable aNumber will be typed as an integer.
Dim aNumber = 5
' The variable aName will be typed as a String.
Dim aName = "Virginia"
L'inférence de type locale permet également de créer des types anonymes, qui sont décrits plus loin dans cette section et sont nécessaires aux requêtes LINQ.
Dans l'exemple LINQ suivant, l'inférence de type se produit si Option Infer a la valeur On ou Off. Une erreur de compilation se produit si Option Infer a la valeur Off et Option Strict a la valeur On.
' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.
Dim numQuery = From num In numbers
Where num Mod 2 = 0
Select num
Initialiseurs d'objets
Les initialiseurs d'objets sont utilisés dans les expressions de requête lorsque vous devez créer un type anonyme pour contenir les résultats d'une requête. Ils peuvent également être utilisés pour initialiser des objets de types nommés en dehors de requêtes. À l'aide d'un initialiseur d'objet, vous pouvez initialiser un objet sur une ligne sans appeler explicitement un constructeur. Supposons que vous ayez une classe nommée Customer possédant des propriétés Name et Phone publiques, ainsi que d'autres propriétés, un initialiseur d'objet peut être utilisé de la manière suivante :
Dim aCust = New Customer With {.Name = "Mike",
.Phone = "555-0212"}
Pour plus d'informations, consultez Initialiseurs d'objets : types nommés et anonymes (Visual Basic).
Types anonymes
Les types anonymes offrent un moyen commode pour regrouper temporairement un ensemble de propriétés en un élément que vous souhaitez inclure dans un résultat de requête. Ceci vous permet de choisir toute combinaison de champs disponibles dans la requête, dans l'ordre voulu, sans définir un type de données nommé pour l'élément.
Un type anonyme est généré dynamiquement par le compilateur. Le nom du type est assigné par le compilateur et il peut varier avec chaque nouvelle compilation. Le nom ne peut donc pas être utilisé directement. Les types anonymes sont initialisés de la manière suivante :
' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}
' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Select cust.Name, cust.Phone
' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Select CustomerName = cust.Name,
CustomerPhone = cust.Phone
Pour plus d'informations, consultez Types anonymes (Visual Basic).
Méthodes d'extension
Les méthodes d'extension vous permettent d'ajouter des méthodes à un type de données ou à une interface à partir de l'extérieur de la définition. Cette fonctionnalité vous permet en fait d'ajouter de nouvelles méthodes à un type existant sans le modifier réellement. Les opérateurs de requête standard sont eux-mêmes un ensemble de méthodes d'extension qui fournissent les fonctionnalités de requête LINQ pour tout type qui implémente IEnumerable. Les autres extensions à IEnumerable comprennent Count, Union et Intersect.
La méthode d'extension suivante ajoute une méthode d'impression à la classe String.
' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
Public Sub Print(ByVal str As String)
Console.WriteLine(str)
End Sub
Cette méthode est appelée comme une méthode d'instance ordinaire de String:
Dim greeting As String = "Hello"
greeting.Print()
Pour plus d'informations, consultez Méthodes d'extension (Visual Basic).
Expressions lambda
Une expression lambda est une fonction sans nom qui calcule et retourne une valeur unique. Contrairement aux fonctions nommées, une expression lambda peut être définie et exécutée simultanément. L'exemple suivant affiche 4.
Console.WriteLine((Function(num As Integer) num + 1)(3))
Vous pouvez assigner la définition d'expression lambda à un nom de variable, puis utiliser ce nom pour appeler la fonction. L'exemple suivant affiche également 4.
Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))
Dans LINQ, les expressions lambda sont à la base d'un grand nombre d'opérateurs de requête standard. Le compilateur crée des expressions lambda pour capturer les calculs qui sont définis dans des méthodes de requête fondamentales, telles que Where, Select, Order By, Take While, etc.
Par exemple, le code suivant définit une requête qui retourne tous les étudiants de second cycle dans une liste d'étudiants.
Dim seniorsQuery = From stdnt In students
Where stdnt.Year = "Senior"
Select stdnt
La définition de la requête est compilée dans un code semblable à l'exemple suivant, qui utilise deux expressions lambda pour spécifier les arguments pour Where et Select.
Dim seniorsQuery2 = students.
Where(Function(st) st.Year = "Senior").
Select(Function(s) s)
Les deux versions peuvent être exécutées à l'aide d'une boucle For Each :
For Each senior In seniorsQuery
Console.WriteLine(senior.Last & ", " & senior.First)
Next
Pour plus d'informations, consultez Expressions lambda (Visual Basic).
Voir aussi
Référence
Concepts
Fonctionnalités C# qui prennent en charge LINQ