Mise à jour : novembre 2007
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 un minimum 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).
Une requête est exécutée une fois que vous avez parcouru la variable de requête dans une instruction foreach. Pour plus d'informations, consultez Introduction aux requêtes LINQ.
À 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écifications 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 et de la syntaxe de méthode (LINQ).
Les expressions de requête peuvent être compilées en arborescences d'expression ou en délégués, en fonction du type auquel la requête est appliquée. Les requêtes IEnumerable<(Of <(T>)>) sont compilées en délégués et les requêtes IQueryable et IQueryable<(Of <(T>)>) sont compilées en arborescences d'expression. Pour plus d'informations, consultez Arborescences d'expression.
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.
Tâches
Concepts
Référence
Autres ressources