À medida que aplicações se tornam mais complexas, a necessidade de manipular dados de forma eficiente em bancos de dados e listas de objetos se torna crucial. Tradicionalmente, isso envolvia o uso de consultas específicas ou lógica manual extensa. O LINQ surgiu como uma solução integrada no C# para simplificar e unificar essas operações, oferecendo uma sintaxe declarativa que melhora a produtividade e a legibilidade do código.
Neste artigo conheceremos três dos principais métodos que compõem o LINQ e que são indispensáveis para todo desenvolvedor .NET.
O que é LINQ?
LINQ é um acrônimo para Language Integrated Query, ou Consulta Integrada à Linguagem. É uma tecnologia que integra consultas de dados diretamente na linguagem C#. Ele unifica a forma de consultar dados de diferentes fontes, proporcionando uma maneira mais intuitiva e declarativa de manipular coleções de objetos, bancos de dados e outros formatos
Para tornar as consultas mais expressivas e concisas, LINQ utiliza expressões lambda. Estas são funções anônimas que podem ser usadas para definir operações diretamente nas consultas LINQ, facilitando a filtragem, ordenação e transformação de dados.
O que são Expressões Lambda?
Expressões lambda são uma forma de definir funções anônimas em C#. Elas são usadas no LINQ Method Syntax para especificar as operações a serem realizadas sobre os dados. Uma expressão lambda usa a sintaxe “=>”, onde a parte à esquerda do operador define os parâmetros de entrada e a parte à direita define a expressão ou bloco de código a ser executado.
Combinando LINQ e expressões lambda, os desenvolvedores podem escrever consultas de maneira fluida e natural, aproveitando a sintaxe familiar do C# para realizar operações complexas de forma simples e legível.
Estrutura de uma consulta LINQ com Expressões Lambda
A estrutura básica de uma consulta LINQ com expressões lambda é:
var resultado = fonteDeDados.Metodo(parâmetro => expressão)
Vamos decompor isso em partes:
- resultado: variável onde o resultado da consulta será armazenado.
- fonteDeDados: a coleção ou fonte de dados sobre a qual a consulta será realizada. Pode ser uma lista, um array, um conjunto de dados de um banco de dados, etc.
- Metodo: o método LINQ que define a operação a ser realizada na fonte de dados (por exemplo, Where, OrderBy, Select).
- parâmetro => expressão: A expressão lambda que define a condição ou a transformação aplicada a cada elemento da fonte de dados.
Estrutura de dados
Para ilustrar como podemos manipular certas estruturas de dados em com LINQ, vamos considerar uma classe “Produto”, cuja estrutura é definida da seguinte forma:
public class Produto
{
public int Id { get; set; }
public string Nome { get; set; }
public decimal Preco { get; set; }
}
E para os exemplos práticos utilizaremos uma lista desses produtos, sobre a qual faremos algumas operações:
List produtos = new List
{
new Produto { Id = 1, Nome = "Notebook", Preco = 1200 },
new Produto { Id = 2, Nome = "Tablet", Preco = 400 },
new Produto { Id = 3, Nome = "Smartphone", Preco = 800 },
new Produto { Id = 4, Nome = "Monitor", Preco = 300 },
new Produto { Id = 5, Nome = "Teclado", Preco = 50 }
};
Filtragem sem LINQ
Sem utilizar LINQ, uma filtragem de produtos cujo preço seja maior que R$ 500 pode ser feita da seguinte maneira:
List ProdutosFiltrados = new List();
foreach (var item in produtos)
{
if (item.Preco > 500)
{
ProdutosFiltrados.Add(item);
}
}
Criamos uma lista chamada “ProdutosFiltrados” que vai receber os produtos que respeitam a regra estabelecida. Utilizamos um laço de repetição “foreach” para percorrer cada item da lista de produtos e verificar se o preço do item atual é maior que R$500. Caso o item cumpra essa regra, ele é adicionado à lista “produtosFiltrados”.
Se observarmos podemos perceber que usamos cerca de oito linhas para poder realizar essa ação. Vamos ver como podemos fazer com o LINQ.
Filtragem com LINQ usando o WHERE
A utilização do LINQ simplifica significativamente o código, reduzindo-o a uma única linha, tornando-o mais legível e fácil de manter:
var produtosFiltrados = produtos.Where(p => p.Preco > 500);
Neste exemplo, o “Where” é um método que permite aplicar uma condição de filtro sobre a coleção. A expressão “p => p.Preco > 500” é uma expressão lambda que define que se o valor de cada produto “p” na coleção “produtos” for maior que R$500 o item será adicionado na lista de “produtosFiltrados”.
Se imprimirmos o resultado no console, teremos o seguinte:
Ordenação com LINQ usando o OrderBy e OrderByDescending
Para ordenar os produtos pelo preço de forma crescente, utilizamos o método “OrderBy”. Este método de extensão permite que especifiquemos uma chave de ordenação através de uma expressão lambda. Aqui está um exemplo de como ordenar a lista de produtos pelo preço em ordem crescente:
var produtosOrdenados = produtos.OrderBy(p => p.Preco);
Agora, ao imprimir os objetos da lista temos o seguinte resultado:
Já para ordenar os produtos pelo preço de forma decrescente, utilizamos o método “OrderByDescending”. Assim como “OrderBy”, este método permite especificar a chave de ordenação, mas a ordenação é feita em ordem decrescente:
var produtosOrdenadosDesc = produtos.OrderByDescending(p => p.Preco);
O resultado agora é este:
Acelere a sua carreira conosco!
Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui
Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui
Seleção com LINQ usando o SELECT
Outra funcionalidade poderosa do LINQ é a capacidade de projetar ou selecionar dados específicos de uma coleção. Por exemplo, para selecionar apenas os nomes dos produtos, podemos usar o método Select:
var nomesProdutos = produtos.Select(p => p.Nome);
Portanto, “nomesProdutos” será uma coleção (no caso, uma IEnumerable<string>) que contém apenas os nomes dos produtos da lista original “produtos”.
Ao imprimir os itens da coleção nomesProdutos, temos o seguinte resultado no console:
Conclusão
O LINQ simplifica significativamente a manipulação e consulta de dados em coleções. Ele permite que você escreva código mais limpo e expressivo, melhorando a legibilidade e a manutenção do código. Através de métodos como Where, OrderBy, OrderByDescending e Select entre outros, o LINQ proporciona uma maneira eficiente de realizar operações comuns de consulta de dados, substituindo abordagens tradicionais mais verbosas. Se você ainda não está utilizando LINQ em suas aplicações C#, vale a pena explorá-lo e aproveitar suas vantagens.