Fonctionnalités Visual Basic qui prennent en charge LINQ

Mise à jour : novembre 2007

Le nom LINQ (Language Integrated Query) fait référence à nouvelle technologie dans Visual Basic 2008 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 2008.

Les sections suivantes décrivent les nouvelles constructions de langage 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 2008 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, comme illustré dans l'exemple suivant. Cette opération est dénommée inférence de type locale.

Remarque :

L'inférence de type locale fonctionne uniquement lorsque vous définissez une variable locale à l'intérieur d'un corps de méthode, avec Option Infer définis à On. On est la valeur par défaut pour les nouveaux projets dans LINQ. Pour plus d'informations, consultez Option Infer, instruction.

' The variable number will be typed as an integer.
Dim aNumber = 5

' The variable name will be typed as a String.
Dim aName = "Virginia"
Remarque :

Dans Visual Basic 2005 et versions précédentes, ces exemples sont compilés, mais le type assigné à la fois à aNumber et aName est Object. Par conséquent, un projet existant qui est recompilé dans Visual Basic 2008, avec Option Infer défini à On, peut avoir un comportement différent de celui qui était le sien dans les versions antérieures de ce langage.

' 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

Les variables déclarées de cette manière sont fortement typées, comme les variables dont vous spécifiez explicitement le type. L'inférence de type locale permet de créer des types anonymes, qui sont nécessaires pour les requêtes LINQ, mais elle peut être utilisée pour toute variable locale.

Pour plus d'informations, consultez Inférence de type local.

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 As Customer = 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 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.

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<T>. Les autres extensions à IEnumerable<T> 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.

Voir aussi

Tâches

Exemples de requêtes (Visual Basic)

Concepts

LINQ et chaînes

Autres ressources

LINQ (Language-Integrated Query)

Mise en route de LINQ dans Visual Basic