Operações de consulta LINQ básica (C#)
Este tópico fornece uma breve introdução às expressões de consulta de LINQ e a alguns dos tipos comuns das operações que você executa uma consulta em. Informações mais detalhadas está nos seguintes tópicos:
Expressões de consulta LINQ (Guia de Programação em C#)
Visão geral de operadores de consulta padrão
Instruções passo a passo: escrevendo consultas em C# (LINQ)
Dica
Se você já estiver familiarizado com uma linguagem de consulta como SQL ou XQuery, você pode ir para a maioria deste tópico.Leitura sobre a cláusula “from ” na seção a seguir a aprender sobre a ordem de cláusulas em expressões de consulta de LINQ .
Obtendo uma fonte de dados
Em uma consulta de LINQ , a primeira etapa é para especificar a fonte de dados. Em C# como na maioria das linguagens de programação uma variável deve ser declarado antes que possa ser usado. Em uma consulta de LINQ , a cláusula de from vem principalmente para apresentar a fonte de dados (customers) e o intervalo variável (cust).
//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
select cust;
A variável de intervalo é como a variável de iteração em um loop de foreach exceto que nenhuma iteração real ocorre em uma expressão de consulta. Quando a consulta é executada, a variável de intervalo servirá como uma referência a cada elemento são em customers. Porque o compilador pode inferir o tipo de cust, você não tem que especifica explicitamente. Variáveis de intervalo adicionais podem ser apresentados por uma cláusula de let . Para obter mais informações, consulte Cláusula let (Referência de C#).
Dica
Para fontes de dados não genéricas, como ArrayLista variável de intervalo deve ser explicitamente digitado.Para obter mais informações, consulte Como consultar um ArrayList com LINQ e Cláusula from (Referência de C#).
Filtro
Provavelmente a maioria de operação comuns de consulta é aplicar um filtro na forma de uma expressão booleana. O filtro faz com que a consulta retorna apenas os elementos para que a expressão for verdadeira. O resultado é gerado usando a cláusula de where . O filtro aplicado especifica que os elementos para excluir a fonte arranjam em sequência. No exemplo, somente o customers que tem um endereço de Londres é retornado.
var queryLondonCustomers = from cust in customers
where cust.City == "London"
select cust;
Você pode usar o C# familiarizado AND lógico e operadores de OR para aplicar conforme necessário tantas expressões de filtro na cláusula de where . Por exemplo, para retornar somente clientes de Londres “” AND cujo nome é “Devon” escreva o código a seguir:
where cust.City=="London" && cust.Name == "Devon"
Para retornar clientes de Londres ou de Paris, escreva o código a seguir:
where cust.City == "London" || cust.City == "Paris"
Para obter mais informações, consulte Cláusula where (Referência de C#).
Classificação
Geralmente é conveniente classificar os dados retornados. A cláusula de orderby fará com que os elementos na sequência retornado para ser classificados de acordo com o comparer padrão para o tipo que está sendo classificado. Por exemplo, a seguinte consulta pode ser estendida para classificar o com base nos resultados na propriedade de Name . Porque Name é uma cadeia de caracteres, o comparer executa uma classificação alfabética padrão da Z.
var queryLondonCustomers3 =
from cust in customers
where cust.City == "London"
orderby cust.Name ascending
select cust;
Para ordenar os resultados em ordem inversa, a Z, use a cláusula de orderby…descending .
Para obter mais informações, consulte Cláusula orderby (Referência de C#).
Agrupamento
A cláusula de group permite que você agrupe seu com base nos resultados em uma chave que você especificar. Por exemplo você pode especificar que os resultados devem ser agrupados por City de modo que todos os clientes de Londres ou de Paris estivessem em grupos individuais. Nesse caso, cust.City é a chave.
// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
var queryCustomersByCity =
from cust in customers
group cust by cust.City;
// customerGroup is an IGrouping<string, Customer>
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}
Quando você termina uma consulta com uma cláusula de group , resultados assume a forma de uma lista de listas. Cada elemento na lista é um objeto que tem um membro de Key e uma lista de elementos que são agrupados na chave. Quando você itera através de uma consulta que produz uma sequência de grupos, você deve usar um loop aninhado de foreach . O loop mais externo itera através de cada grupo, e o loop mais interno itera através dos membros de cada grupo.
Se você deve referenciar os resultados de uma operação do grupo, você pode usar a palavra-chave de into para criar um identificador que pode ser consultado mais. A seguinte consulta retorna apenas os grupos que contêm mais de dois clientes:
// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() > 2
orderby custGroup.Key
select custGroup;
Para obter mais informações, consulte Cláusula group (Referência de C#).
O join
Adição a operações criar associações entre as sequências que não são explicitamente modeladas nas fontes de dados. Por exemplo você pode executar uma união para localizar todos os clientes e distribuidores que têm o mesmo local. Em LINQ a cláusula de join funciona sempre x coleções de objeto em vez de tabelas de banco de dados diretamente.
var innerJoinQuery =
from cust in customers
join dist in distributors on cust.City equals dist.City
select new { CustomerName = cust.Name, DistributorName = dist.Name };
Em LINQ você não precisa usar join tão frequentemente como você fez no SQL como as chaves estrangeiras em LINQ são representadas no modelo de objeto como propriedades que contém uma coleção de itens. Por exemplo, um objeto de Customer contém uma coleção de objetos de Order . Em vez de executar uma associação, você acessa os pedidos usando notação de ponto:
from order in Customer.Orders...
Para obter mais informações, consulte Cláusula join (Referência de C#).
Selecione (projeções)
A cláusula de select produz resultados de consulta e especifica a “forma” ou o tipo de cada elemento retornado. Por exemplo, você pode especificar se os resultados consistirão em objetos completos de Customer , apenas um membro, um subconjunto de membros, ou qualquer tipo completamente diferente do resultado com base em uma computação ou em uma nova criação do objeto. Quando a cláusula de select produz algo diferente de uma cópia do elemento de origem, a operação é chamada uma projeção. O uso de projeções transformar dados é um recurso avançado de expressões de consulta de LINQ . Para obter mais informações, consulte Transformações de dados com LINQ (C#) e Cláusula select (Referência de C#).
Consulte também
Tarefas
Instruções passo a passo: escrevendo consultas em C# (LINQ)
Referência
Tipos anônimos (Guia de Programação em C#)
Conceitos
Expressões de consulta LINQ (Guia de Programação em C#)
Operações de consulta básica (Visual Basic)