Relaciones entre tipos en operaciones de consulta LINQ (C#)
Para escribir las consultas eficazmente, es necesario comprender cómo los tipos de las variables en una operación de consulta completa se relacionan entre sí. Si entiende estas relaciones comprenderá más fácilmente los ejemplos de LINQ y los ejemplos de código de la documentación. Además, entenderá lo que sucede en segundo plano cuando los tipos de las variables se declaran implícitamente mediante var.
las operaciones de consulta LINQ tienen un establecimiento fuertemente tipado en el origen de datos, en la propia consulta y en la ejecución de la consulta. El tipo de las variables de la consulta debe ser compatible con el tipo de los elementos del origen de datos y con el tipo de la variable de iteración de la instrucción foreach. Este establecimiento inflexible de tipos garantiza que los errores de tipos se detectan en tiempo de compilación, cuando aún se pueden corregir antes de que los usuarios los detecten.
Para mostrar estas relaciones de tipos, en la mayoría de los ejemplos siguientes se usan tipos explícitos para todas las variables. En el último ejemplo se muestra cómo se aplican los mismos principios incluso al usar tipos implícitos mediante var.
Consultas que no transforman los datos de origen
La ilustración siguiente muestra una operación de consulta de LINQ to Objects que no realiza ninguna transformación de los datos. El origen contiene una secuencia de cadenas y el resultado de la consulta también es una secuencia de cadenas.

El argumento de tipo del origen de datos determina el tipo de la variable de rango.
El tipo del objeto que está seleccionado determina el tipo de la variable de consulta. Aquí,
namees una cadena. Por tanto, la variable de consulta esIEnumerable<string>.La variable de consulta se procesa en iteración en la instrucción
foreach. Dado que la variable de consulta es una secuencia de cadenas, la variable de iteración también es una cadena.
Consultas que transforman los datos de origen
En la ilustración siguiente se muestra una operación de consulta LINQ to SQL que realiza una transformación simple de los datos. La consulta usa una secuencia de objetos Customer como entrada y selecciona solo la propiedad Name en el resultado. Dado que Name es una cadena, la consulta genera una secuencia de cadenas como resultado.

El argumento de tipo del origen de datos determina el tipo de la variable de rango.
La instrucción
selectdevuelve la propiedadNameen lugar del objetoCustomercompleto. Dado queNamees una cadena, el argumento de tipo decustNameQueryesstring, noCustomer.Dado que
custNameQueryes una secuencia de cadenas, la variable de iteración del bucleforeachtambién debe serstring.
En la ilustración siguiente se muestra una transformación un poco más compleja. La instrucción select devuelve un tipo anónimo que captura solo dos miembros del objeto Customer original.

El argumento de tipo del origen de datos siempre es el tipo de la variable de rango de la consulta.
Dado que la instrucción
selectgenera un tipo anónimo, la variable de consulta debe declararse implícitamente mediantevar.Dado que el tipo de la variable de consulta es implícito, la variable de iteración del bucle
foreachtambién debe ser implícita.
Permitir que el compilador deduzca la información de tipo
Aunque debería comprender las relaciones de los tipos en una operación de consulta, tiene la opción de que el compilador le haga todo el trabajo. La palabra clave var se puede usar para cualquier variable local en una operación de consulta. La ilustración siguiente es similar al ejemplo número 2 que se ha analizado anteriormente. En cambio, el compilador proporciona el tipo seguro de cada variable en la operación de consulta.

Para obtener más información sobre var, vea Variables locales con asignación implícita de tipos.