Relaciones entre tipos en operaciones de consulta LINQ (C#)Type Relationships in LINQ Query Operations (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í.To write queries effectively, you should understand how types of the variables in a complete query operation all relate to each other. Si entiende estas relaciones comprenderá más fácilmente los ejemplos de LINQLINQ y los ejemplos de código de la documentación.If you understand these relationships you will more easily comprehend the LINQLINQ samples and code examples in the documentation. Además, entenderá lo que sucede en segundo plano cuando los tipos de las variables se declaran implícitamente mediante var.Furthermore, you will understand what occurs behind the scenes when variables are implicitly typed by using var.

Las operaciones de consulta LINQLINQ tienen un establecimiento inflexible de tipos en el origen de datos, en la propia consulta y en la ejecución de la consulta.LINQLINQ query operations are strongly typed in the data source, in the query itself, and in the query execution. 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.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. 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.This strong typing guarantees that type errors are caught at compile time when they can be corrected before users encounter them.

Para mostrar estas relaciones de tipos, en la mayoría de los ejemplos siguientes se usan tipos explícitos para todas las variables.In order to demonstrate these type relationships, most of the examples that follow use explicit typing for all variables. En el último ejemplo se muestra cómo se aplican los mismos principios incluso al usar tipos implícitos mediante var.The last example shows how the same principles apply even when you use implicit typing by using var.

Consultas que no transforman los datos de origenQueries that do not Transform the Source Data

La ilustración siguiente muestra una operación de consulta LINQLINQ to Objects que no realiza ninguna transformación de los datos.The following illustration shows a LINQLINQ to Objects query operation that performs no transformations on the data. El origen contiene una secuencia de cadenas y el resultado de la consulta también es una secuencia de cadenas.The source contains a sequence of strings and the query output is also a sequence of strings.

Diagrama que muestra a la relación de tipos de datos en una consulta LINQ.

  1. El argumento de tipo del origen de datos determina el tipo de la variable de rango.The type argument of the data source determines the type of the range variable.

  2. El tipo del objeto que está seleccionado determina el tipo de la variable de consulta.The type of the object that is selected determines the type of the query variable. Aquí, name es una cadena.Here name is a string. Por tanto, la variable de consulta es IEnumerable<string>.Therefore, the query variable is an IEnumerable<string>.

  3. La variable de consulta se procesa en iteración en la instrucción foreach.The query variable is iterated over in the foreach statement. Dado que la variable de consulta es una secuencia de cadenas, la variable de iteración también es una cadena.Because the query variable is a sequence of strings, the iteration variable is also a string.

Consultas que transforman los datos de origenQueries that Transform the Source Data

En la ilustración siguiente se muestra una operación de consulta LINQ to SQLLINQ to SQL que realiza una transformación simple de los datos.The following illustration shows a LINQ to SQLLINQ to SQL query operation that performs a simple transformation on the data. La consulta usa una secuencia de objetos Customer como entrada y selecciona solo la propiedad Name en el resultado.The query takes a sequence of Customer objects as input, and selects only the Name property in the result. Dado que Name es una cadena, la consulta genera una secuencia de cadenas como resultado.Because Name is a string, the query produces a sequence of strings as output.

Diagrama que muestra una consulta que transforma el tipo de datos.

  1. El argumento de tipo del origen de datos determina el tipo de la variable de rango.The type argument of the data source determines the type of the range variable.

  2. La instrucción select devuelve la propiedad Name en lugar del objeto Customer completo.The select statement returns the Name property instead of the complete Customer object. Dado que Name es una cadena, el argumento de tipo de custNameQuery es string, no Customer.Because Name is a string, the type argument of custNameQuery is string, not Customer.

  3. Dado que custNameQuery es una secuencia de cadenas, la variable de iteración del bucle foreach también debe ser string.Because custNameQuery is a sequence of strings, the foreach loop's iteration variable must also be a string.

En la ilustración siguiente se muestra una transformación un poco más compleja.The following illustration shows a slightly more complex transformation. La instrucción select devuelve un tipo anónimo que captura solo dos miembros del objeto Customer original.The select statement returns an anonymous type that captures just two members of the original Customer object.

Diagrama que muestra una consulta más compleja que transforma el tipo de datos.

  1. El argumento de tipo del origen de datos siempre es el tipo de la variable de rango de la consulta.The type argument of the data source is always the type of the range variable in the query.

  2. Dado que la instrucción select genera un tipo anónimo, la variable de consulta debe declararse implícitamente mediante var.Because the select statement produces an anonymous type, the query variable must be implicitly typed by using 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.Because the type of the query variable is implicit, the iteration variable in the foreach loop must also be implicit.

Permitir que el compilador deduzca la información de tipoLetting the compiler infer type information

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.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. La palabra clave var se puede usar para cualquier variable local en una operación de consulta.The keyword var can be used for any local variable in a query operation. La ilustración siguiente es similar al ejemplo número 2 que se ha analizado anteriormente.The following illustration is similar to example number 2 that was discussed earlier. En cambio, el compilador proporciona el tipo seguro de cada variable en la operación de consulta.However, the compiler supplies the strong type for each variable in the query operation.

Diagrama que muestra el flujo de tipos implícitos.

Para obtener más información sobre var, vea Variables locales con asignación implícita de tipos.For more information about var, see Implicitly Typed Local Variables.