Operadores essenciais
ResumoUm punhado de operadores LINQ cobre a maioria das necessidades: filtrar (
Where), projetar (Select), ordenar (OrderBy), agrupar (GroupBy) e agregar (Count,Sum,First). Dominá-los é essencial para trabalhar com dados.
1. Objetivos de Aprendizagem#
- Usar filtragem, projeção, ordenação e agrupamento.
- Aplicar operadores de agregação e de elemento.
- Encadear operadores em pipelines claros.
2. Pré-requisitos#
- Query vs method syntax (tópico 8.1).
3. Conceito#
Grupos de operadores:
- Filtragem:
Where. - Projeção:
Select,SelectMany. - Ordenação:
OrderBy,OrderByDescending,ThenBy. - Agrupamento:
GroupBy. - Agregação:
Count,Sum,Average,Min,Max. - Elemento:
First,FirstOrDefault,Single,Any,All.
O porquê: expressar transformações de dados de forma declarativa, sem laços manuais e variáveis de controle.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.LinqOps
cd Catalog.LinqOps
4.2. Implementação Passo a Passo#
record Produto(string Nome, decimal Preco, string Categoria);
var produtos = new List<Produto>
{
new("Mouse", 90m, "Periféricos"),
new("Teclado", 120m, "Periféricos"),
new("Monitor", 1200m, "Telas"),
new("Webcam", 250m, "Periféricos"),
};
// Filtragem + projeção
var nomesCaros = produtos.Where(p => p.Preco > 100).Select(p => p.Nome);
// Agregação
decimal total = produtos.Sum(p => p.Preco);
int quantidade = produtos.Count(p => p.Categoria == "Periféricos");
// Elemento
var maisCaro = produtos.OrderByDescending(p => p.Preco).First();
bool temTela = produtos.Any(p => p.Categoria == "Telas");
// Agrupamento
var porCategoria = produtos
.GroupBy(p => p.Categoria)
.Select(g => new { Categoria = g.Key, Total = g.Sum(p => p.Preco) });
foreach (var item in porCategoria)
Console.WriteLine($"{item.Categoria}: {item.Total:C}");
4.3. Executando#
dotnet run
5. Exemplo Completo#
O agrupamento por categoria com soma de preços é um relatório completo em 3 linhas de LINQ — o tipo de operação que aparece o tempo todo em APIs (filtros, totais, dashboards).
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
Usar FirstOrDefault quando pode não haver resultado | First em coleção que pode estar vazia (lança exceção) |
Usar Any() para checar existência | Count() > 0 quando só quer saber se existe |
| Encadear operadores em pipeline legível | Consultas monstruosas numa linha só |
Atenção
Singlelança exceção se houver mais de um elemento. Use-o só quando garantir unicidade; caso contrário,First/FirstOrDefault.
7. Segurança e Produção#
- Com EF Core, prefira
Any()aCount() > 0para checar existência — gera SQL mais eficiente (EXISTS).
8. Exercícios#
- Fácil: conte quantos produtos custam mais de 100.
- Médio: obtenha o produto mais barato de cada categoria.
- Desafio: produza um resumo
{ Categoria, Média, Quantidade }por categoria.
9. Resumo#
Where, Select, OrderBy, GroupBy e as agregações (Sum, Count, First, Any) cobrem a maior parte das transformações. Prefira Any() e FirstOrDefault para código seguro.
10. Próximos Passos#
A seguir, o comportamento que mais confunde iniciantes: execução adiada.
11. Referências#
- Microsoft Learn — Operadores de consulta padrão
- Microsoft Learn — Ordenação de dados
- Microsoft Learn — Agrupamento de dados