Desenvolvimento - C#
Cláusulas Let, Group By e Order By no LINQ
Neste artigo será demonstrado como utilizar as cláusulas let, group by e order by em uma consulta LINQ to SQL utilizando a linguagem C#.
por Thiago VidalVeremos nesse artigo como tratar algumas consultas com LINQ, mas nenhum mapeamento entre banco de dados e aplicação será detalhado. Quando se trabalha com LINQ, percebe-se que existe uma grande similaridade com a sintaxe de uma query no SQL Server. No exemplo da Listagem 1 foi criada no banco uma tabela chamada tbFuncionarios.
Listagem 1. Criação de uma tabela de funcionários no banco de dados.
create table tbFuncionarios ( ID int not null primary key, Nome varchar(50) not null, Departamento varchar(5) not null, Salario int not null )
Suponha-se que é solicitado quanto cada funcionário ganha por departamento. Então é feito um agrupamento de funcionários por departamento e por salário (uma chave composta). No LINQ, o group by funciona da seguinte maneira:
- O agrupamento é dado por um objeto IGrouping<TKey, TElement>;
- O TElement representa o objeto que você quer agrupar (funcionario – definido na cláusula from) e depois debyvem a chave do agrupamento. No caso,quando se tem uma chave composta, definimos um tipo anônimo para tal, pela palavra-chave new;
- Por fim, cria-se uma variável que vai armazenar o agrupamento (intof).
A cláusula let permite criar variáveis locais a uma query. Imagine que é solicitada a somatória do salário de todos os funcionários. O LINQ fornece um método de extensão, o Sum, que faz a soma dos valores dos objetos de uma coleção. Da mesma forma, o método Average, também de extensão, calcula a média aritmética simples dos valores de uma coleção. E o resultado disso é guardado nas variáveissalarioTotalemediaSalarial.
A ordenação é feita pelas chaves Departamento e Salario em ordem crescente (por default), acessadas pela propriedadeKeyda variável de agrupamento. Se quiser aplicar uma ordenação decrescente, adicione a palavra-chavedescendingno final da cláusula orderby, como mostra a Listagem 2.
Listagem 2. Montando a query no LINQ.
var query = from funcionario in context.tbFuncionarios group funcionario by new { funcionario.Departamento, funcionario.Salario } into f let salarioTotal = context.tbFuncionarios.Sum(x => x.Salario) let mediaSalarial = context.tbFuncionarios.Average(x => x.Salario) orderby f.Key.Departamento, f.Key.Salario select new { Salario = f.Key.Salario, Departamento = f.Key.Departamento, Total = salarioTotal, Media = mediaSalarial };
O resultado da query pode ser impresso por um foreach, como mostra a Listagem 3.
Listagem 3. Imprimindo o resultado da query.
foreach (var func in query) { Console.WriteLine("Departamento: " + func.Departamento + "\t" + "Salário: " + func.Salario); //etc.. }
Clique aqui e baixe o código fonte desse artigo.
Até a próxima.