Fonctionnalités Visual Basic prenant en charge LINQ

Le nom Language-Integrated Query (LINQ) fait référence à la technologie en 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 besoin d’apprendre un nouveau langage pour interroger une source de données externe. Vous pouvez interroger des données dans des bases de données relationnelles, des magasins XML ou des objets à l'aide de Visual Basic. Cette intégration des fonctionnalités de requête dans le langage permet de vérifier les erreurs de syntaxe et la sécurité de type au moment de la compilation. Cette intégration garantit également que vous savez déjà la plupart de ce que vous devez savoir pour écrire des requêtes riches et variées dans Visual Basic.

Les sections suivantes décrivent les constructions de langage qui supportent LINQ de manière suffisamment détaillée pour vous permettre de commencer à lire la documentation d'introduction, les exemples de code et les exemples d'applications. Vous pouvez également cliquer sur les liens pour obtenir des explications plus détaillées sur la façon dont les fonctionnalités de langage s’assemblent pour activer la requête intégrée au langage. Un bon point de départ est Procédure pas à pas : Écrire des requêtes en Visual Basic.

Expressions de requête

Les expressions de requête en Visual Basic peuvent être exprimées dans une syntaxe déclarative similaire à celle de SQL ou XQuery. Au moment de la compilation, la syntaxe de la requête est convertie en appels de méthode à l'implémentation par un fournisseur LINQ des méthodes d'extension de l'opérateur de requête standard. Les applications contrôlent les opérateurs de requête standard qui se trouvent dans la portée en spécifiant l’espace de noms approprié avec une directive Imports. La syntaxe d’une expression de requête Visual Basic ressemble à ceci :

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 aux requêtes LINQ dans Visual Basic.

Variables implicitement typées

Au lieu de spécifier explicitement un type lorsque vous déclarez et initialisez une variable, vous pouvez permettre au compilateur de déduire et d'attribuer le type. C’est ce qu’on appelle l’inférence de type local.

Les variables dont les types sont déduits sont fortement typées, tout comme les variables dont vous spécifiez explicitement le type. L'inférence de type local ne fonctionne que lorsque vous définissez une variable locale dans le corps d'une méthode. Pour plus d'informations, voir Option Déduire la déclaration et Inférence de type local.

L’exemple suivant illustre l’inférence de type local. Pour utiliser cet exemple, vous devez paramétrer Option Infer sur 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 local permet également de créer des types anonymes, qui sont décrits plus loin dans cette section et qui sont nécessaires pour les requêtes LINQ.

Dans l’exemple LINQ suivant, l’inférence de type se produit si Option Infer est soit On ou Off. Une erreur de compilation se produit si Option Infer est Off et Option Strict est 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 des requêtes. L'utilisation d'un initialisateur d'objet permet d'initialiser un objet en une seule ligne sans appeler explicitement un constructeur. En supposant que vous disposez d’une classe nommée Customer qui a des propriétés publiques Name et Phone des propriétés, ainsi que d’autres propriétés, un initialiseur d’objet peut être utilisé de cette manière :

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Pour plus d’informations, consultez Initialiseurs d’objets : types nommés et anonymes.

Types anonymes

Les types anonymes offrent un moyen pratique de regrouper temporairement un ensemble de propriétés dans un élément que vous souhaitez inclure dans un résultat de requête. Cela vous permet de choisir n'importe quelle combinaison de champs disponibles dans la requête, dans n'importe quel ordre, sans définir un type de données nommé pour l'élément.

Un type anonyme est construit dynamiquement par le compilateur. Le nom du type est attribué par le compilateur et il peut changer à 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.

Méthodes d’extension

Les méthodes d’extension vous permettent d’ajouter des méthodes à un type de données ou à une interface en dehors de la définition. Cette fonctionnalité permet d’ajouter de nouvelles méthodes aux types existants sans les modifier. Les opérateurs de requête standard sont eux-mêmes un ensemble de méthodes d'extension qui fournissent la fonctionnalité de requête LINQ pour tout type qui implémente IEnumerable<T>. Autres extensions à IEnumerable<T> inclure Count, Unionet Intersect.

La méthode d’extension suivante ajoute une méthode print à 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

La méthode est appelée comme une méthode instance ordinaire de String:

Dim greeting As String = "Hello"
greeting.Print()

Pour plus d’informations, consultez Méthodes d’extension.

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 en même temps. L'exemple suivant affiche 4.

Console.WriteLine((Function(num As Integer) num + 1)(3))

Vous pouvez affecter la définition d’expression lambda à un nom de variable, puis utiliser le 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 sous-tendent la plupart des opérateurs de requête standard. Le compilateur crée des expressions lambda pour capturer les calculs définis dans les méthodes de requête fondamentales telles que Where, Select, Order By, Take Whileet d’autres.

Par exemple, le code suivant définit une requête qui retourne tous les étudiants de niveau supérieur à partir d’une liste d’étudiants.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

La définition de requête est compilée dans un code similaire à 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)

L'une ou l'autre version peut être exécutée en utilisant une For Each boucle :

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Pour plus d’informations, consultez Expressions lambda.

Voir aussi