Partager via


Language Integrated Query (LINQ)

Language-Integrated Query (LINQ) est le nom d’un ensemble de technologies basée sur l’intégration des fonctionnalités de requête directement dans le langage C#. Traditionnellement, les requêtes sur des données sont exprimées sous forme de chaînes simples sans vérification de type lors de la compilation et sans prise en charge d'IntelliSense. En outre, vous devez apprendre un langage de requête différent pour chaque type de source de données : bases de données SQL, documents XML, différents services Web, et ainsi de suite. Avec LINQ, une requête est une construction de langage de première classe, comme les classes, les méthodes et les événements.

Lorsque vous écrivez des requêtes, la partie « intégrée au langage » la plus visible de LINQ est l’expression de requête. Les expressions de requête sont écrites dans une syntaxe de requête déclarative. En utilisant la syntaxe de requête, vous effectuez des opérations de filtrage, de classement et de regroupement sur des sources de données avec un minimum de code. Vous utilisez les mêmes modèles d’expression de requête pour interroger et transformer des données à partir de n’importe quel type de source de données.

L’exemple suivant montre une opération de requête complète. L’opération complète inclut la création d’une source de données, la définition de l’expression de requête et l’exécution de la requête dans une foreach instruction.

// Specify the data source.
int[] scores = [97, 92, 81, 60];

// Define the query expression.
IEnumerable<int> scoreQuery =
    from score in scores
    where score > 80
    select score;

// Execute the query.
foreach (var i in scoreQuery)
{
    Console.Write(i + " ");
}

// Output: 97 92 81

Vous devrez peut-être ajouter une using directive, using System.Linq;pour que l’exemple précédent soit compilé. Les versions les plus récentes de .NET utilisent des utilisations implicites pour ajouter cette directive en tant qu’utilisation globale. Les versions antérieures vous obligent à l’ajouter dans votre source.

Vue d’ensemble de l’expression de requête

  • Les expressions de requête interrogent et transforment les données à partir de n’importe quelle source de données compatible LINQ. Par exemple, une requête unique peut récupérer des données à partir d’une base de données SQL et produire un flux XML en tant que sortie.
  • Les expressions de requête utilisent de nombreuses constructions de langage C# familières, ce qui facilite leur lecture.
  • Les variables d’une expression de requête sont toutes fortement typées.
  • Une requête n’est pas exécutée tant que vous n’effectuez pas d’itération sur la variable de requête, par exemple dans une foreach instruction.
  • Au moment de la compilation, les expressions de requête sont converties en appels de méthode d’opérateur de requête standard en fonction des règles définies dans la spécification C#. Toute requête qui peut être exprimée à l’aide de la syntaxe de requête peut également être exprimée à l’aide de la syntaxe de méthode. Dans certains cas, la syntaxe de requête est plus lisible et concise. Dans d’autres, la syntaxe de méthode est plus lisible. Il n’existe aucune différence sémantique ou de performance entre les deux formes différentes. Pour plus d’informations, consultez la spécification du langage C# et la vue d’ensemble des opérateurs de requête Standard.
  • Certaines opérations de requête, telles que Count ou Max, n’ont pas de clause d’expression de requête équivalente et doivent donc être exprimées en tant qu’appel de méthode. La syntaxe de méthode peut être combinée à la syntaxe de requête de différentes manières.
  • Les expressions de requête peuvent être compilées dans des arborescences d’expressions ou des délégués, selon le type auquel la requête est appliquée. Les requêtes IEnumerable<T> sont compilées en délégués. IQueryable et IQueryable<T> les requêtes sont compilées en arborescences d’expressions. Pour plus d’informations, consultez arborescences d’expressions.

Comment activer l’interrogation LINQ de votre source de données

Données en mémoire

Il existe deux façons d’activer l’interrogation LINQ des données en mémoire. Si les données sont d’un type qui implémente IEnumerable<T>, vous interrogez les données à l’aide de LINQ to Objects. S’il n’est pas judicieux d’activer l’énumération en implémentant l’interface IEnumerable<T> , vous définissez les méthodes d’opérateur de requête standard LINQ, dans ce type ou comme méthodes d’extension pour ce type. Les implémentations personnalisées des opérateurs de requête standard doivent utiliser l’exécution différée pour retourner les résultats.

Données distantes

La meilleure option pour activer l’interrogation LINQ d’une source de données distante consiste à implémenter l’interface IQueryable<T> .

Fournisseurs IQueryable LINQ

Les fournisseurs LINQ qui implémentent IQueryable<T> peuvent varier considérablement dans leur complexité.

Un fournisseur moins complexe IQueryable peut accéder à une méthode unique à partir d’un service Web. Ce type de fournisseur est très spécifique, car il attend des informations spécifiques dans les requêtes qu’il gère. Il a un système de type fermé, qui expose peut-être un seul type de résultat. La plupart de l’exécution de la requête se produit localement, par exemple en utilisant les Enumerable implémentations des opérateurs de requête standard. Un fournisseur moins complexe peut examiner une seule expression d’appel de méthode dans l’arborescence d’expressions qui représente la requête et laisser la logique restante de la requête être gérée ailleurs.

Un IQueryable fournisseur de complexité moyenne peut cibler une source de données qui a un langage de requête partiellement expressif. S’il cible un service Web, il peut accéder à plusieurs méthodes du service Web et sélectionner la méthode à appeler en fonction des informations que la requête recherche. Un fournisseur de complexité moyenne aurait un système de type plus riche qu’un fournisseur simple, mais il serait toujours un système de type fixe. Par exemple, le fournisseur peut exposer des types qui ont des relations un-à-plusieurs qui peuvent être parcourues, mais il ne fournirait pas de technologie de mappage pour les types définis par l’utilisateur.

Un fournisseur complexe IQueryable , tel que le fournisseur Entity Framework Core , peut traduire des requêtes LINQ complètes en langage de requête expressif, tel que SQL. Un fournisseur complexe est plus général, car il peut gérer une plus grande variété de questions dans la requête. Il dispose également d’un système de type ouvert et doit donc contenir une infrastructure étendue pour mapper les types définis par l’utilisateur. Le développement d’un fournisseur complexe nécessite une quantité importante d’efforts.