Relations des types dans des opérations de requête (LINQ)
Mise à jour : novembre 2007
Pour écrire des requêtes de manière efficace, vous devez comprendre comment les types des variables dans une opération de requête complète sont tous liés les uns aux autres. Si vous comprenez ces relations, vous comprendrez plus facilement les exemples de code et exemples LINQ dans la documentation. En outre, vous comprendrez ce qui se passe en arrière-plan lorsque des variables sont implicitement typées à l'aide de var.
Les opérations de requête LINQ sont fortement typées dans la source de données, dans la requête elle-même et dans l'exécution de la requête. Le type des variables dans la requête doit être compatible avec le type des éléments dans la source de données, ainsi qu'avec le type de la variable d'itération dans l'instruction foreach. Ce typage fort garantit l'interception des erreurs de type au moment de la compilation lorsqu'elles peuvent être corrigées avant que les utilisateurs ne les rencontrent.
Pour illustrer ces relations des types, la plupart des exemples qui suivent utilisent le type explicite pour toutes les variables. Le dernier exemple indique comment les mêmes principes s'appliquent, même lorsque vous utilisez des types implicites à l'aide de var.
Les requêtes qui ne transforment pas les données source
L'illustration suivante présente une opération de requête LINQ to Objects qui n'effectue pas de transformation des données. La source contient une séquence de chaînes et le résultat de la requête est également une séquence de chaînes.
L'argument de type de la source de données détermine le type de la variable de portée.
Le type de l'objet sélectionné détermine le type de la variable de requête. Ici, name est une chaîne. Par conséquent, la variable de requête est une <chaîne> IEnumerable.
La variable de requête est parcourue dans l'instruction foreach. Étant donné que la variable de requête est une séquence de chaînes, la variable d'itération est également une chaîne.
Les requêtes qui transforment les données source
L'illustration suivante présente une opération de requête LINQ to SQL qui effectue une transformation simple des données. La requête prend une séquence d'objets Customer comme entrée et sélectionne uniquement la propriété Name dans le résultat. Étant donné que Name est une chaîne, la requête produit une séquence de chaînes comme sortie.
L'argument de type de la source de données détermine le type de la variable de portée.
L'instruction select retourne la propriété Name au lieu de l'objet Customer complet. Étant donné que Name est une chaîne, l'argument de type de custNameQuery est string, et non Customer.
Étant donné que custNameQuery est une séquence de chaînes, la variable d'itération de la boucle foreach doit également être une string.
L'illustration suivante présente une transformation sensiblement plus complexe. L'instruction select retourne un type anonyme qui capture seulement deux membres de l'objet Customer d'origine.
L'argument de type de la source de données est toujours le type de la variable de portée dans la requête.
Étant donné que l'instruction select produit un type anonyme, la variable de requête doit être implicitement typée à l'aide de var.
Étant donné que le type de la variable de requête est implicite, la variable d'itération dans la boucle foreach doit également être implicite.
Laisser le compilateur déduire les informations de type
Même si vous devez comprendre les relations des types dans une opération de requête, vous avez la possibilité de laisser le compilateur faire tout le travail pour vous. Le mot clé var peut être utilisé pour toute variable locale dans une opération de requête. L'illustration suivante équivaut exactement à l'exemple numéro 2 qui a été abordé précédemment. La seule différence est que le compilateur fournira le type fort pour chaque variable dans l'opération de requête :
Pour plus d'informations sur var, consultez Variables locales implicitement typées (Guide de programmation C#).