Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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 à interroger sur 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 au moment de la compilation les erreurs de syntaxe et la sécurité des types. Cette intégration garantit également que vous connaissez déjà la plupart de ce que vous devez savoir pour écrire des requêtes riches et variées en Visual Basic.
Les sections suivantes décrivent les constructions de langage qui prennent en charge LINQ en détail 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 trouver des explications plus détaillées sur la façon dont les fonctionnalités de langage sont réunies pour activer la requête intégrée au langage. Un bon point de départ est la procédure pas à pas : écriture de requêtes en Visual Basic.
Expressions de requête
Les expressions de requête dans 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 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 contrôlent les opérateurs de requête standard dans l’étendue en spécifiant l’espace de noms approprié avec une Imports instruction. 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 Présentation de 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’affecter le type. Il s’agit de 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 à l’intérieur d’un corps de méthode. Pour plus d’informations, consultez l’instruction Option Infer et l’inférence de type local.
L’exemple suivant illustre l’inférence de type local. Pour utiliser cet exemple, vous devez définir la Onvaleur Option Infer .
' 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 sont nécessaires pour les requêtes LINQ.
Dans l’exemple LINQ suivant, l’inférence de type se produit si Option Infer elle est ou OnOff. Une erreur au moment de la compilation se produit si Option Infer elle 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’aide d’un initialiseur d’objet, vous pouvez initialiser un objet dans 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 façon :
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 affecté par le compilateur et peut changer avec chaque nouvelle compilation. Par conséquent, le nom ne peut 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é vous permet, en effet, d’ajouter de nouvelles méthodes à un type existant sans réellement modifier le type. Les opérateurs de requête standard sont eux-mêmes un ensemble de méthodes d’extension qui fournissent des fonctionnalités 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 String classe.
' 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 d’instance ordinaire de String:
Dim greeting As String = "Hello"
greeting.Print()
Pour plus d’informations, consultez Méthodes d’extension.
Lambda Expressions
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 supérieurs 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 en 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 à l’aide d’une For Each boucle :
For Each senior In seniorsQuery
Console.WriteLine(senior.Last & ", " & senior.First)
Next
Pour plus d’informations, consultez Expressions lambda.