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 você entender essas relações, compreenderá mais facilmente os exemplos de código e exemplos de LINQ na documentação.If you understand these relationships you will more easily comprehend the LINQ 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
.
As operações de consulta LINQ são fortemente tipadas na fonte de dados, na própria consulta e na execução da consulta.LINQ 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 LINQ to Objects que não executa transformações nos dados.The following illustration shows a LINQ 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.
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.
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
.Herename
is a string. Portanto, a variável de consulta é umIEnumerable<string>
.Therefore, the query variable is anIEnumerable<string>
.A variável de consulta é iterada na instrução
foreach
.The query variable is iterated over in theforeach
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.
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.
A instrução
select
retorna a propriedadeName
em vez do objetoCustomer
completo.Theselect
statement returns theName
property instead of the completeCustomer
object. ComoName
é uma cadeia de caracteres, o argumento de tipo decustNameQuery
éstring
e nãoCustomer
.BecauseName
is a string, the type argument ofcustNameQuery
isstring
, notCustomer
.Como
custNameQuery
é uma sequência de cadeias de caracteres, a variável de iteração do loopforeach
também deve ser umstring
.BecausecustNameQuery
is a sequence of strings, theforeach
loop's iteration variable must also be astring
.
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.
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.
Como a instrução
select
produz um tipo anônimo, a variável de consulta deve ser tipada implicitamente usandovar
.Because theselect
statement produces an anonymous type, the query variable must be implicitly typed by usingvar
.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 theforeach
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.
Para obter mais informações sobre var
, consulte Variáveis de local digitadas implicitamente.For more information about var
, see Implicitly Typed Local Variables.