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 Vidal



Veremos 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.

Thiago Vidal

Thiago Vidal - Trabalha em Landz Tecnologia. Frequentou a PUC de São Paulo. Mora em São Paulo