Compartilhar via


Como 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 por meio de 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.

Dica

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 inferior a 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. Todas essas consultas poderiam ser escritas 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ê pode iterar sobre a variável de consulta em um foreach instrução. Para obter mais informações, consulte Introdução a consultas 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 retornam 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 tiver parâmetros, as informações são fornecidas na forma de um lambda expressão, conforme mostrado no exemplo a seguir:

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

Nas consultas anteriores, somente consulta n º 4 executa imediatamente. Isso ocorre porque ele retorna um único valor e não um genérico IEnumerable coleção. O próprio método deve usar uma foreach para calcular o seu valor.

Cada uma das consultas anteriores pode ser gravada por meio 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 está entre 3 e 7. Em geral, no entanto, é melhor usar uma segunda variável para armazenar o resultado da chamada do método. Dessa forma, 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 for executada imediatamente.

A consulta anterior pode ser escrita por meio 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 usando uma digitação explícita, da seguinte maneira:

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

Consulte também

Tarefas

Instruções passo a passo: escrevendo consultas em C# (LINQ)

Referência

Cláusula where (Referência de C#)

Conceitos

Expressões de consulta LINQ (Guia de Programação em C#)

Outros recursos

LINQ (Consulta Integrada à Linguagem)