Compartir a través de


Relaciones entre tipos en operaciones de consulta (LINQ)

Actualización: noviembre 2007

Para escribir las consultas eficazmente, es necesario comprender cómo se relacionan entre sí los tipos de las variables en una operación de consulta completa. 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 establecimiento inflexible de tipos 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 utilizan tipos explícitos para todas las variables. En el último ejemplo se muestra cómo se aplican los mismos principios incluso al utilizar tipos implícitos mediante var.

Consultas que no transforman los datos de origen

La ilustración siguiente muestra una operación de consulta 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.

  1. El argumento de tipo del origen de datos determina el tipo de la variable de rango.

  2. El tipo del objeto que está seleccionado determina el tipo de la variable de consulta. Aquí, name es una cadena. Por lo tanto, la variable de consulta es IEnumerable<string>.

  3. 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

La ilustración siguiente muestra una operación de consulta LINQ to SQL que realiza una transformación simple de los datos. La consulta utiliza una secuencia de objetos Customer como entrada y selecciona sólo la propiedad Name en el resultado. Dado que Name es una cadena, la consulta genera una secuencia de cadenas como resultado.

  1. El argumento de tipo del origen de datos determina el tipo de la variable de rango.

  2. La instrucción select devuelve la propiedad Name en lugar del objeto Customer completo. Dado que Name es una cadena, el argumento de tipo de custNameQuery es string, no Customer.

  3. Dado que custNameQuery es una secuencia de cadenas, la variable de iteración del bucle foreach también debe ser string.

La ilustración siguiente muestra una transformación un poco más compleja. La instrucción select devuelve un tipo anónimo que captura sólo dos miembros del objeto Customer original.

  1. El argumento de tipo del origen de datos siempre es el tipo de la variable de rango de la consulta.

  2. Dado que la instrucción select genera un tipo anónimo, el tipo de la variable de consulta debe declararse implícitamente mediante var.

  3. Dado que el tipo de la variable de consulta es implícito, la variable de iteración del bucle foreach tambié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 haga todo el trabajo por usted. La palabra clave var se puede utilizar para cualquier variable local en una operación de consulta. La ilustración siguiente es totalmente equivalente al ejemplo número 2 antes analizado. La única diferencia es que el compilador proporcionará el tipo seguro de cada variable en la operación de la consulta:

Para obtener más información acerca de var, vea Variables locales con asignación implícita de tipos (Guía de programación de C#).

Vea también

Otros recursos

Introducción a LINQ en C#