How to: Escrever consultas LINQ em C#

Este tópico mostra as três maneiras em que você pode escrever um LINQ consulta no C#:

  1. Use a sintaxe de consulta.

  2. Use a sintaxe do método.

  3. Use uma combinação de sintaxe de consulta e a sintaxe do método.

Os exemplos a seguir demonstram alguns simples LINQ consultas usando cada abordagem listados anteriormente. Em geral, a regra é para uso (1) sempre que possível e o uso (2) e (3) sempre que necessário.

ObservaçãoObservação

Essas consultas operam em coleções de simples na memória; No entanto, a sintaxe básica é idêntica ao usado em LINQ to SQL e LINQ to XML.

Exemplo

Sintaxe de consulta

A maneira recomendada para escrever a maioria das consultas é usar sintaxe de consulta para criar expressões de consulta. O exemplo a seguir mostra três expressões de consulta. A primeira expressão de consulta demonstra como filtrar ou restringir os resultados aplicando condições com um where cláusula. Ela retorna todos os elementos na seqüência de origem, cujos valores são maiores do que 7 ou menor que 3. A segunda expressão demonstra como ordenar os resultados retornados. A terceira expressão demonstra como agrupar resultados de acordo com uma chave. Esta consulta retorna dois grupos com base na primeira letra da palavra.

// Query #1.
List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

// The query variable can also be implicitly typed by using var
IEnumerable<int> filteringQuery =
    from num in numbers
    where num < 3 || num > 7
    select num;

// Query #2.
IEnumerable<int> orderingQuery =
    from num in numbers
    where num < 3 || num > 7
    orderby num ascending
    select num;

// Query #3.
string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };
IEnumerable<IGrouping<char, string>> queryFoodGroups =
    from item in groupingQuery
    group item by item[0];

Observe que o tipo das consultas é IEnumerable<T>. Todas essas consultas podem ser gravadas usando var conforme mostrado no exemplo a seguir:

var query = from num in numbers...

Em cada exemplo anterior, as consultas não realmente executar até que você itera a variável de consulta em um foreach instrução. Para obter mais informações, consulte Introdução às consultas do LINQ (C#).

Sintaxe do método

Algumas operações de consulta devem ser expresso como uma chamada de método. O mais comum tais métodos são aqueles que retornar valores numéricos de singleton, como Sum, Max, Min, Averagee assim por diante. Esses métodos devem sempre ser chamados pela última vez em qualquer consulta porque eles representam apenas um único valor e não podem servir como a fonte para uma operação de consulta adicionais. O exemplo a seguir mostra uma chamada de método em uma expressão de consulta:

List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };
// Query #4.
double average = numbers1.Average();

// Query #5.
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

Se o método possui parâmetros, eles são fornecidos na forma de um lambda expressão, conforme mostrado no exemplo a seguir:

// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

Em consultas anteriores, somente consulta n º 4 executa imediatamente. Isso é porque ela retorna um único valor e não um genérico IEnumerable<T> coleção. O próprio método tem para utilizar foreach para calcular o valor.

Cada uma das consultas anteriores pode ser gravada usando o recurso de digitação implícita com var, conforme mostrado no exemplo a seguir:

// var is used for convenience in these queries
var average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);

Misto de consulta e a sintaxe do método

Este exemplo mostra como usar a sintaxe do método nos resultados de uma cláusula de consulta. Basta colocar a expressão de consulta entre parênteses e aplicar o operador dot e chamar o método. No exemplo a seguir, a consulta # 7 retorna uma contagem dos números cujo valor é entre 3 e 7. Em geral, no entanto, é melhor usar uma segunda variável para armazenar o resultado da chamada do método. Dessa maneira, a consulta é menos provável que deve ser confundido com os resultados da consulta.

// Query #7.

// Using a query expression with method syntax
int numCount1 =
    (from num in numbers1
     where num < 3 || num > 7
     select num).Count();

// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =
    from num in numbers1
    where num < 3 || num > 7
    select num;

int numCount2 = numbersQuery.Count();

Como # 7 da consulta retorna um único valor e não é uma coleção, a consulta é executada imediatamente.

A consulta anterior pode ser escrita usando o recurso de digitação implícita com var, da seguinte forma:

var numCount = (from num in numbers...

Ele pode ser escrito na sintaxe do método da seguinte maneira:

var numCount = numbers.Where(n => n < 3 || n > 7).Count();

Ele pode ser escrito por meio de uma digitação explícita, da seguinte maneira:

int numCount = numbers.Where(n => n < 3 || n > 7).Count();

Consulte também

Tarefas

Demonstra Passo a passo: Escrever consultas em C# (LINQ)

Referência

onde a cláusula (referência de C#)

Conceitos

LINQ Expressões de consulta (guia de programação de C#)

Outros recursos

LINQ (consulta integrada à linguagem)