Páginas

domingo, 2 de junho de 2013

LINQ: Utilizando OrderBy e GroupBy


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 1 - 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)
        {
            NORTHWNDEntities dc = new NORTHWNDEntities();

            #region OrderBy

            gdvProdutos.DataSource = from p in dc.Products
                                     where p.CategoryID == 1
                                     orderby p.ProductName
                                     select p;
            gdvProdutos.DataBind();

            #endregion
          
        }

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.  Agrupar na sua definição pura:

agrupar - conjugação

verbo transitivo
1.
pôr ou dispor em grupo

2.
juntar; reunir

3.
associar

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

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

Figura 2 - 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:
  •          Pessoas por estado
  •          Quantidade de compras por cliente
  •          Valor de compras por cliente
  •          Pessoas por departamento
  •          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 3 - Quantidade de produtos por categoria
*Se quiser conferir o valor da informação, na Figura 1 contém apenas os 
produtos da Categoria 1.

Segue o código que gerou a Figura 3.

protected void Page_Load(object sender, EventArgs e)
        {
            NORTHWNDEntities dc = new NORTHWNDEntities();         

       gdvQuantidadeProdutoPorCategoria.DataSource =
     from p in dc.Products
     group p by p.CategoryID into g
                  select new { CodCategoria = g.Key, ProdPorCateg = g.Count() };

            gdvQuantidadeProdutoPorCategoria.DataBind();
        }
   

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.




                              

segunda-feira, 4 de fevereiro de 2013

LINQ: Utilizando where e Classe anônima


Olá! Vamos filtrar dados com LINQ?

No último post vimos a moleza que é configurar o Entity e utilizá-lo. Nesse post veremos como fazer consultas simples utilizando o LINQ.

Utilizando o mesmo projeto do último post, faremos um filtro na coleção* de produtos que faz Bind* na grid de produtos.

Como o LINQ faz lembrar bastante o SQL, o Operador que faz filtro é o “Where”. 

Essa é a cara da grid que deixamos no último post e o código. 


protected void Page_Load(object sender, EventArgs e)
        {
            NORTHWNDEntities dc = new NORTHWNDEntities();

            gdvProdutos.DataSource = from p in dc.Products select p;
            gdvProdutos.DataBind();

        }

Vamos fazer um filtro que nos mostre apenas os produtos cujo CategoryID seja igual a 2. Abaixo segue a imagem da tela e o código modificado com o filtro:



protected void Page_Load(object sender, EventArgs e)
        {
            NORTHWNDEntities dc = new NORTHWNDEntities();

            gdvProdutos.DataSource = from p in dc.Products
                                     where p.CategoryID == 2
                                     select p;
            gdvProdutos.DataBind();

        }

Digamos agora que você caro leitor precise de apenas algumas das colunas da classe produtos. Como fazer para selecionar apenas as colunas necessárias?

Lançaremos mão de um recurso chamado de Classe Anônima que, assim como os métodos anônimos, são criados em tempo de execução.

Criação de classe anônima:

A classe comum é criada assim: Tipo teste1 = new Tipo(){ propriedade1 = 1, propriedade2 = 2}

Na classe anônima dispensamos a informação do Tipo apenas informamos o nome das propriedades e no nosso caso o valor virá do banco de dados.

select new { propriedade1, propriedade2, propriedade3}.

Essa é a cara da grid apenas com 3 propriedades e o código:


protected void Page_Load(object sender, EventArgs e)
        {
          NORTHWNDEntities dc = new NORTHWNDEntities();

          gdvProdutos.DataSource = from p in dc.Products
                                where p.CategoryID == 2
                                select new { p.ProductName, p.UnitPrice, p.QuantityPerUnit };

            gdvProdutos.DataBind();

        }


Por hoje é só!

Espero que tenham gostado e aprendido coisas novas!