LINQ: Utilizando OrderBy e GroupBy
Autor: Danielle de Santana | Publicado: 2013-06-02T17:20:00-07:00




OrderBy



Olá! Vamos
Agrupar e Ordenar dados com LINQ????



Então
utilizando os mesmos dados dos Posts anteriores, faremos uma ordenação por nome
utilizando LINQ. 



Ordenação
pra quem trabalha com programação é coisa corriqueira logo, não me alongarei no
nessa parte ;-).




Figura&nbsp;1&nbsp;- Produtos da Categoria 1 ordenados por Nome






O código
abaixo gera o resultado acima: produtos da categoria 1 ordenados por nome.



protected
void Page_Load(object
sender, EventArgs e)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NORTHWNDEntities
dc = new NORTHWNDEntities();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #region OrderBy



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdvProdutos.DataSource = from p in dc.Products

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where p.CategoryID == 1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orderby p.ProductName

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select p;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdvProdutos.DataBind();



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endregion

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



GroupBy





Agora sim!
Mesmo sendo outro assunto corriqueiro para quem trabalha com programação, vou supor
que apenas os novatos estão lendo essa parte hehehehe.



Primeiro vou
discorrer sobre o que seria agrupar. &nbsp;Agrupar na sua definição pura:



agrupar&nbsp;-&nbsp;conjugação



verbo&nbsp;transitivo

 

  
1.

  
pôr&nbsp;ou&nbsp;dispor&nbsp;em&nbsp;grupo

 




 

  
2.

  
juntar;&nbsp;reunir

 




 

  
3.

  
associar

 



agrupar&nbsp;In Infopédia [Em linha]. Porto: Porto Editora, 2003-2013.
[Consult. 2013-06-03].
Disponível na www: http://www.infopedia.pt/lingua-portuguesa/agrupar
&gt;.



Logo seria
separar em grupos coisas que são semelhantes (ou iguais), segue uma imagem de
autoria própria que mostra um agrupamento:




Figura&nbsp;2&nbsp;- Agrupamento de figuras pela quantidade de lados


As figuras
estão Agrupadas de acordo com o estabelecido pelo programador, mas há outras
associações (mais sérias inclusive) que podem ser feitas no dia-a-dia de trabalho.
Seguem exemplos de agrupamento:



&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pessoas
por estado
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Quantidade
de compras por cliente
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Valor
de compras por cliente
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pessoas
por departamento
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pessoas
por faixa de salário



Viu? São inúmeras
as aplicações de agrupamento! 



Segue a
imagem dos produtos agrupados por categoria. 




Figura&nbsp;3&nbsp;- Quantidade de produtos por categoria


*Se quiser conferir o valor da informação, na Figura 1 contém
apenas os&nbsp;

produtos da Categoria 1.



Segue o código que gerou a Figura 3.



protected
void Page_Load(object
sender, EventArgs e)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NORTHWNDEntities
dc = new NORTHWNDEntities();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdvQuantidadeProdutoPorCategoria.DataSource
= 

&nbsp;&nbsp;&nbsp;&nbsp; from p in dc.Products

&nbsp;&nbsp;&nbsp;&nbsp; group p by p.CategoryID into
g

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select new {
CodCategoria = g.Key, ProdPorCateg = g.Count() };



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdvQuantidadeProdutoPorCategoria.DataBind();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; 



Que a palavra group by faz o agrupamento disso ninguém tem dúvida J. Agora o que fazer com isso é que
é o problema...



Vamos analisar: group
p by p.CategoryID into
g



p são todos os produtos que estão na tabela dc.Products, no que você
comanda group p by
p.CategoryID você já está dividindo os produtos pelas suas categorias. 



A segunda parte do comando é into g,
isso significa que o resultado dessa divisão estará dentro de g! 



A partir daí é só brincar! Você pode contar (g.Count()) a quantidade
de produtos dentro de cada categoria, somar os valores dos produtos dentro de
cada categoria, etc.








&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;