Compartilhar via


Relacionamentos de tipo em operações de consulta LINQ (C#)

Para gravar consultas com eficiência, você deve entender como os tipos de variáveis em uma operação completa de consulta se relacionam uns com os outros. Se compreender essas relações, você entenderá mais facilmente os exemplos e os códigos de exemplo do LINQ na documentação. Além disso, você entenderá o que ocorre em segundo plano quando variáveis são tipadas implicitamente usando var.

as operações de consulta de LINQsão fortemente tipadas na fonte de dados, na consulta em si, e na execução da consulta. O tipo das variáveis na consulta deve ser compatíveis com o tipo dos elementos da fonte de dados e com o tipo da variável de iteração na declaração foreach. Este tipagem forte garante que os erros de tipo sejam capturados em tempo de compilação quando puderem ser corrigidos antes de serem encontrados pelos usuários.

Para demonstrar essas relações de tipo, a maioria dos exemplos a seguir usa digitação explícita para todas as variáveis. O último exemplo mostra como os mesmos princípios se aplicam mesmo quando você usa a tipagem implícita utilizando var.

Consultas que não transformam os dados de origem

A ilustração a seguir mostra uma operação de consulta LINQ para a operação de consulta Objetos que não executa transformações nos dados. A origem contém uma sequência de cadeias de caracteres e saída de consulta também é uma sequência de cadeias de caracteres.

Relação de tipos de dados em uma consulta LINQ

  1. O argumento do tipo da fonte de dados determina o tipo de variável de intervalo disponível.

  2. O tipo de objeto selecionado determina o tipo da variável de consulta. Esta name é uma cadeia de caracteres. Portanto, a variável de consulta é uma IEnumerable<string>.

  3. A variável de consulta é iterada na instrução foreach. Porque a variável de consulta é uma sequência de cadeias de caracteres, a variável de iteração também é uma cadeia de caracteres.

Consultas que transformam os dados de origem

A ilustração a seguir mostra uma operação de consulta LINQ to SQL que executa uma transformação simples nos dados. A consulta usa uma sequência de objetos Customer como entrada e seleciona somente a propriedade Name no resultado. Como Name é uma cadeia de caracteres, a consulta gera uma sequência de cadeias de caracteres como saída.

Uma consulta que transforma o tipo de dados

  1. O argumento do tipo da fonte de dados determina o tipo de variável de intervalo disponível.

  2. A instrução select retorna a propriedade Name em vez do objeto Customer concluído. Como Name é uma cadeia de caracteres, o argumento do tipo custNameQuery é string, não Customer.

  3. Como custNameQuery é uma sequência de cadeias de caracteres, a variável de iteração do loop foreach também deve ser string.

A ilustração a seguir mostra uma transformação um pouco mais complexa. A instrução select retorna um tipo anônimo que captura apenas dois membros do objeto Customer original.

Uma consulta que transforma o tipo de dados

  1. O argumento do tipo da fonte de dados sempre será o tipo da variável de intervalo na consulta.

  2. Como a declaração select gera um tipo anônimo, a variável de consulta deve ser implicitamente tipada usando 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ícita.

Deixando o compilador inferir informações de tipo

Embora você deva compreender as relações de tipo em uma operação de consulta, você tem a opção permitir que o compilador faz todo o trabalho para você. A palavra-chave var pode ser usada para qualquer variável local em uma operação de consulta. A ilustração a seguir é semelhante ao exemplo número 2 discutido anteriormente. No entanto, o compilador fornece o tipo forte para cada variável na operação de consulta.

Fluxo de tipos com tipagem implícita

Para obter mais informações sobre var, consulte Variáveis locais de tipo implícito (Guia de Programação em C#).

Consulte também

Conceitos

Relacionamentos de tipo em operações de consulta (Visual Basic)

Outros recursos

Introdução a LINQ em C#