Como: escrever consultas LINQ em C#
Este tópico mostra as três maneiras em que você pode escrever um LINQ consulta no C#:
Use a sintaxe de consulta.
Use a sintaxe do método.
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.
Observaçã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 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<T>.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 à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 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<T> 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
Passo a passo: Escrever consultas em C# (LINQ)
Referência
onde a cláusula (referência de C#)
Conceitos
Expressões de consulta do LINQ (guia de programação do C#)