Expressions de requête LINQ (Guide de programmation C#)
LINQ (Language Integrated Query) est le nom d'un ensemble de technologies basé sur l'intégration de fonctions de requête directement dans le langage C# (également dans Visual Basic et potentiellement dans tout autre langage .NET). Avec LINQ, une requête est désormais une construction de langage de premier ordre, comme les classes, les méthodes, les événements, etc.
Pour un développeur qui écrit des requêtes, la partie « intégrée par 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, introduite dans C# 3.0. En utilisant la syntaxe de requête, vous pouvez même effectuer des opérations de filtrage, de classement et de regroupement complexes sur les sources de données avec une quantité minimale de code. Vous utilisez les mêmes modèles de base d'expression de requête pour interroger et transformer des données dans les bases de données SQL, les groupes de données du ADO.NET, les documents XML et les flux de données, ainsi que les collections .NET.
L'exemple suivant présente l'ensemble de l'opération de requê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 instruction foreach.
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
Pour plus d'informations sur l'essentiel de LINQ en C#, consultez Mise en route de LINQ en C#.
Vue d'ensemble des expressions de requête
Les expressions de requête peuvent être utilisées pour interroger et transformer des données à partir de n'importe quelle source de données LINQ. Par exemple, une requête unique peut récupérer des données d'une base de données SQL et générer un flux de données XML en sortie.
Les expressions de requête sont faciles à maîtriser car elles utilisent de nombreuses constructions de langage C# familières. Pour plus d'informations, consultez Mise en route de LINQ en C#.
Les variables d'une expression de requête sont toutes fortement typées, bien que dans de nombreux cas vous ne devez pas fournir le type explicitement parce que le compilateur peut le déduire. Pour plus d'informations, consultez Relations des types dans des opérations de requête LINQ (C#).
Une requête est exécutée une fois que vous avez itéré la variable de requête dans une instruction foreach. Pour plus d'informations, consultez Introduction aux requêtes LINQ (C#).
À la compilation, les expressions de requête sont converties en appels de méthode d'opérateur de requête standard d'après les règles présentées dans la spécification C#. Toute requête qui peut être exprimée en utilisant la syntaxe de requête peut également être exprimée en utilisant la syntaxe de méthode. Toutefois, dans la plupart des cas, la syntaxe de requête est plus lisible et concise. Pour plus d'informations, consultez Spécification du langage C# et Vue d'ensemble des opérateurs de requête standard.
En règle générale, quand vous écrivez des requêtes LINQ, nous vous recommandons d'utiliser la syntaxe de requête chaque fois que cela est possible et la syntaxe de méthode lorsque cela est nécessaire. Il y a aucune différence en termes de sémantique ou de performance entre les deux différentes formes. Les expressions de requête sont souvent plus lisibles que les expressions équivalentes écrites dans la syntaxe de méthode.
Quelques-unes des opérations de requête, telles que Count ou Max, n'ont aucune clause d'expression de requête équivalente et doivent par conséquent être exprimées comme un appel de méthode. La syntaxe de méthode peut être associée de plusieurs façons avec la syntaxe de requête. Pour plus d'informations, consultez Comparaison de la syntaxe de requête LINQ et de la syntaxe de méthode (C#).
Les expressions de requête peuvent être compilées en arborescences d'expression ou en délégués, selon le type auquel la requête s'applique. Les requêtes IEnumerable<T> sont compilées en délégués. Les requêtes IQueryable et IQueryable<T> sont compilées en arborescences d'expression. Pour plus d'informations, consultez Arborescences d'expression (C# et Visual Basic).
Le tableau suivant répertorie les rubriques qui fournissent des informations supplémentaires à propos des requêtes et des exemples de code pour les tâches courantes.
Rubrique |
Description |
---|---|
Concepts de base des expressions de requête (Guide de programmation C#) |
Introduit des concepts de requête fondamentaux et fournit des exemples de syntaxe de requête de C#. |
Fournit des exemples de plusieurs types de base d'expressions de requête. |
|
Comment : gérer des exceptions dans des expressions de requête (Guide de programmation C#) |
Comment et quand déplacer le code potentiel levant des exceptions à l'extérieur d'une expression de requête. |
Comment : remplir des collections d'objets issues de plusieurs sources (LINQ) |
Comment utiliser l'instruction select pour fusionner des données de sources différentes dans un nouveau type. |
Comment : regrouper les résultats d'une requête (Guide de programmation C#) |
Montre différentes manières d'utiliser la clause group. |
Comment : créer un groupe imbriqué (Guide de programmation C#) |
Montre comment créer des groupes imbriqués. |
Comment : effectuer une sous-requête sur une opération de regroupement (Guide de programmation C#) |
Montre comment utiliser une sous-expression dans une requête comme une source de données pour une nouvelle requête. |
Comment : regrouper des résultats par clés contiguës (Guide de programmation C#) |
Explique comment implémenter un opérateur de requête standard thread-safe capable de réaliser des opérations de regroupement sur des sources de données en continu. |
Montre comment fournir un nombre arbitraire de valeurs à utiliser dans les comparaisons d'égalité dans une clause where. |
|
Comment : stocker les résultats d'une requête dans la mémoire (Guide de programmation C#) |
Montre comment matérialiser et stocker les résultats d'une requête sans nécessairement utiliser une boucle foreach. |
Comment : retourner une requête à partir d'une méthode (Guide de programmation C#) |
Montre comment retourner des variables de requête à partir de méthodes et comment les passer aux méthodes comme paramètres d'entrée. |
Comment : effectuer des opérations de jointure personnalisées (Guide de programmation C#) |
Montre comment effectuer des opérations de jointure à partir de n'importe quel type de fonction de prédicat. |
Montre comment joindre deux sources basées sur plusieurs clés correspondantes. |
|
Comment : classer les résultats d'une clause Join (Guide de programmation C#) |
Montre comment classer une séquence générée par une opération de jointure. |
Comment : effectuer des jointures internes (Guide de programmation C#) |
Montre comment effectuer une jointure interne dans LINQ. |
Comment : effectuer des jointures groupées (Guide de programmation C#) |
Montre comment générer une jointure groupée dans LINQ. |
Comment : effectuer des jointures externes gauches (Guide de programmation C#) |
Montre comment générer une jointure externe gauche dans LINQ. |
Comment : gérer des valeurs Null dans des expressions de requête (Guide de programmation C#) |
Montre comment gérer des valeurs Null dans les requêtes LINQ. |
Voir aussi
Tâches
Procédure pas à pas : écriture de requêtes en C# (LINQ)
Concepts
Opérations de requête LINQ de base (C#)
Comparaison de la syntaxe de requête LINQ et de la syntaxe de méthode (C#)
Vue d'ensemble des opérateurs de requête standard
Autres ressources
LINQ (Language-Integrated Query)
Mots clés de requête (Référence C#)
Fonctionnement des requêtes Linq to Objects Queries (page éventuellement en anglais)
Lecture et écriture de requêtes (page éventuellement en anglais)
Qu'est-ce qu'une collection ? (page éventuellement en anglais)
Liens tous azimuts : liste de fournisseurs LINQ (page éventuellement en anglais)