Relations des types dans des opérations de requête LINQ (C#)Type Relationships in LINQ Query Operations (C#)

Pour écrire efficacement des requêtes, vous devez comprendre comment les types des variables dans une opération de requête complète sont liés les uns aux autres.To write queries effectively, you should understand how types of the variables in a complete query operation all relate to each other. Si vous comprenez ces relations, vous comprendrez plus facilement les exemples de code et les exemples LINQLINQ dans la documentation.If you understand these relationships you will more easily comprehend the LINQLINQ samples and code examples in the documentation. En outre, vous comprendrez ce qui se passe en arrière-plan lorsque des variables sont implicitement typées à l’aide de var.Furthermore, you will understand what occurs behind the scenes when variables are implicitly typed by using var.

Les opérations de requête LINQLINQ 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.LINQLINQ query operations are strongly typed in the data source, in the query itself, and in the query execution. 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.The type of the variables in the query must be compatible with the type of the elements in the data source and with the type of the iteration variable in the foreach statement. 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.This strong typing guarantees that type errors are caught at compile time when they can be corrected before users encounter them.

Pour illustrer ces relations de types, la plupart des exemples qui suivent utilisent le typage explicite pour toutes les variables.In order to demonstrate these type relationships, most of the examples that follow use explicit typing for all variables. Le dernier exemple montre comment les mêmes principes s’appliquent même si vous utilisez le typage implicite à l’aide de var.The last example shows how the same principles apply even when you use implicit typing by using var.

Requêtes qui ne transforment pas les données sourcesQueries that do not Transform the Source Data

L’illustration suivante montre une opération de requête LINQLINQ to Objects qui n’effectue aucune transformation des données.The following illustration shows a LINQLINQ to Objects query operation that performs no transformations on the data. 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.The source contains a sequence of strings and the query output is also a sequence of strings.

Diagramme illustrant la relation entre les types de données dans une requête LINQ.

  1. L’argument de type de la source de données détermine le type de la variable de portée.The type argument of the data source determines the type of the range variable.

  2. Le type de l’objet sélectionné détermine le type de la variable de requête.The type of the object that is selected determines the type of the query variable. Ici, name est une chaîne.Here name is a string. Par conséquent, la variable de requête est un IEnumerable<string>.Therefore, the query variable is an IEnumerable<string>.

  3. La variable de requête fait l’objet d’une itération dans l’instruction foreach.The query variable is iterated over in the foreach statement. Comme la variable de requête est une séquence de chaînes, la variable d’itération est également une chaîne.Because the query variable is a sequence of strings, the iteration variable is also a string.

Requêtes qui transforment les données sourcesQueries that Transform the Source Data

L’illustration suivante montre une opération de requête LINQ to SQLLINQ to SQL qui effectue une transformation simple des données.The following illustration shows a LINQ to SQLLINQ to SQL query operation that performs a simple transformation on the data. La requête accepte une séquence d’objets Customer en entrée et sélectionne uniquement la propriété Name dans le résultat.The query takes a sequence of Customer objects as input, and selects only the Name property in the result. Comme Name est une chaîne, la requête produit une séquence de chaînes en sortie.Because Name is a string, the query produces a sequence of strings as output.

Diagramme montrant une requête qui transforme le type de données.

  1. L’argument de type de la source de données détermine le type de la variable de portée.The type argument of the data source determines the type of the range variable.

  2. L’instruction select retourne la propriété Name à la place de l’objet Customer complet.The select statement returns the Name property instead of the complete Customer object. Comme Name est une chaîne, l’argument de type de custNameQuery est string, et non pas Customer.Because Name is a string, the type argument of custNameQuery is string, not Customer.

  3. Comme custNameQuery est une séquence de chaînes, la variable d’itération de la boucle foreach doit également être de type string.Because custNameQuery is a sequence of strings, the foreach loop's iteration variable must also be a string.

L’illustration suivante montre une transformation légèrement plus complexe.The following illustration shows a slightly more complex transformation. L’instruction select retourne un type anonyme qui capture seulement deux membres de l’objet Customer original.The select statement returns an anonymous type that captures just two members of the original Customer object.

Diagramme montrant une requête plus complexe qui transforme le type de données.

  1. L’argument de type de la source de données est toujours le type de la variable de portée dans la requête.The type argument of the data source is always the type of the range variable in the query.

  2. Comme l’instruction select génère un type anonyme, la variable de requête doit être implicitement typée à l’aide de var.Because the select statement produces an anonymous type, the query variable must be implicitly typed by using var.

  3. Comme le type de la variable de requête est implicite, la variable d’itération dans la boucle foreach doit également être implicite.Because the type of the query variable is implicit, the iteration variable in the foreach loop must also be implicit.

Laisser le compilateur déduire les informations de typeLetting the compiler infer type information

Vous devez comprendre les relations des types dans une opération de requête. Toutefois, vous avez la possibilité de laisser le compilateur faire tout le travail à votre place.Although you should understand the type relationships in a query operation, you have the option to let the compiler do all the work for you. Le mot clé var peut être utilisé pour toute variable locale dans une opération de requête.The keyword var can be used for any local variable in a query operation. L’illustration suivante est similaire à l’exemple numéro 2 qui a été abordé précédemment.The following illustration is similar to example number 2 that was discussed earlier. Toutefois, le compilateur fournit le type fort pour chaque variable dans l’opération de requête.However, the compiler supplies the strong type for each variable in the query operation.

Diagramme illustrant le flux de type avec typage implicite.

Pour plus d’informations sur var, consultez Variables locales implicitement typées.For more information about var, see Implicitly Typed Local Variables.