Relacionamentos de tipo em operações de consulta LINQ (C#)Type Relationships in LINQ Query Operations (C#)

Para escrever consultas com eficiência, você precisa entender como os tipos de variáveis em uma operação de consulta completa se relacionam entre si.To write queries effectively, you should understand how types of the variables in a complete query operation all relate to each other. Se compreender esses relacionamentos, você compreenderá com maior facilidade os exemplos de LINQLINQ e exemplos de código na documentação.If you understand these relationships you will more easily comprehend the LINQLINQ samples and code examples in the documentation. Além disso, você compreenderá o que ocorre nos bastidores quando variáveis são tipadas de forma implícita usando var.Furthermore, you will understand what occurs behind the scenes when variables are implicitly typed by using var.

Operações de consulta de LINQLINQ são fortemente tipadas na fonte de dados, na própria consulta e na execução da consulta.LINQLINQ query operations are strongly typed in the data source, in the query itself, and in the query execution. O tipo das variáveis na consulta deve ser compatível com o tipo dos elementos na fonte de dados e com o tipo da variável de iteração na instrução 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. Essa tipagem forte garante que erros de tipo sejam capturados em tempo de compilação, quando podem ser corrigidos antes que os usuários os encontrem.This strong typing guarantees that type errors are caught at compile time when they can be corrected before users encounter them.

Para demonstrar essas relações de tipo, a maioria dos exemplos a seguir usam tipagem explícita para todas as variáveis.In order to demonstrate these type relationships, most of the examples that follow use explicit typing for all variables. O último exemplo mostra como os mesmos princípios se aplicam mesmo quando você usa tipagem implícita usando var.The last example shows how the same principles apply even when you use implicit typing by using var.

Consultas que não transformam os dados de origemQueries that do not Transform the Source Data

A ilustração a seguir mostra uma operação de consulta de LINQLINQ to Objects que não executa transformações nos dados.The following illustration shows a LINQLINQ to Objects query operation that performs no transformations on the data. A fonte contém uma sequência de cadeias de caracteres e a saída da consulta também é uma sequência de cadeias de caracteres.The source contains a sequence of strings and the query output is also a sequence of strings.

Diagrama que mostra a relação dos tipos de dados em uma consulta LINQ.

  1. O argumento de tipo da fonte de dados determina o tipo da variável de intervalo.The type argument of the data source determines the type of the range variable.

  2. O tipo do objeto selecionado determina o tipo da variável de consulta.The type of the object that is selected determines the type of the query variable. Esta é uma cadeia de caracteres name.Here name is a string. Portanto, a variável de consulta é um IEnumerable<string>.Therefore, the query variable is an IEnumerable<string>.

  3. A variável de consulta é iterada na instrução foreach.The query variable is iterated over in the foreach statement. Como a variável de consulta é uma sequência de cadeias de caracteres, a variável de iteração também é uma cadeia de caracteres.Because the query variable is a sequence of strings, the iteration variable is also a string.

Consultas que transformam os dados de origemQueries that Transform the Source Data

A ilustração a seguir mostra uma operação de consulta de LINQ to SQLLINQ to SQL que executa transformações simples nos dados.The following illustration shows a LINQ to SQLLINQ to SQL query operation that performs a simple transformation on the data. A consulta usa uma sequência de objetos Customer como entrada e seleciona somente a propriedade Name no resultado.The query takes a sequence of Customer objects as input, and selects only the Name property in the result. Como Name é uma cadeia de caracteres, a consulta produz uma sequência de cadeias de caracteres como saída.Because Name is a string, the query produces a sequence of strings as output.

Diagrama que mostra uma consulta que transforma o tipo de dados.

  1. O argumento de tipo da fonte de dados determina o tipo da variável de intervalo.The type argument of the data source determines the type of the range variable.

  2. A instrução select retorna a propriedade Name em vez do objeto Customer completo.The select statement returns the Name property instead of the complete Customer object. Como Name é uma cadeia de caracteres, o argumento de tipo de custNameQuery é string e não Customer.Because Name is a string, the type argument of custNameQuery is string, not Customer.

  3. Como custNameQuery é uma sequência de cadeias de caracteres, a variável de iteração do loop foreach também deve ser um string.Because custNameQuery is a sequence of strings, the foreach loop's iteration variable must also be a string.

A ilustração a seguir mostra uma transformação um pouco mais complexa.The following illustration shows a slightly more complex transformation. A instrução select retorna um tipo anônimo que captura apenas dois membros do objeto Customer original.The select statement returns an anonymous type that captures just two members of the original Customer object.

Diagrama que mostra uma consulta mais complexa que transforma o tipo de dados.

  1. O argumento de tipo da fonte de dados sempre é o tipo da variável de intervalo na consulta.The type argument of the data source is always the type of the range variable in the query.

  2. Como a instrução select produz um tipo anônimo, a variável de consulta deve ser tipada implicitamente usando var.Because the select statement produces an anonymous type, the query variable must be implicitly typed by using var.

  3. Como o tipo da variável de consulta é implícito, a variável de iteração no loop foreach também deve ser implícito.Because the type of the query variable is implicit, the iteration variable in the foreach loop must also be implicit.

Deixando o compilador inferir informações de tipoLetting the compiler infer type information

Embora você precise entender as relações de tipo em uma operação de consulta, você tem a opção de permitir que o compilador fazer todo o trabalho.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. A palavra-chave var pode ser usada para qualquer variável local em uma operação de consulta.The keyword var can be used for any local variable in a query operation. A ilustração a seguir é semelhante ao exemplo número 2 que foi discutido anteriormente.The following illustration is similar to example number 2 that was discussed earlier. No entanto, o compilador fornece o tipo forte para cada variável na operação de consulta.However, the compiler supplies the strong type for each variable in the query operation.

Diagrama que mostra o fluxo de tipo com tipagem implícita.

Para obter mais informações sobre var, consulte Variáveis de local digitadas implicitamente.For more information about var, see Implicitly Typed Local Variables.