none
Agrupar dados RRS feed

  • Pergunta

  • Pessoal,

    Não estou conseguindo montar uma query linq que agrupe os dados de um DataRow, criei o seguinte datatable:

     

    DataTable table = new DataTable();
          table.Columns.Add("Codigo");
          table.Columns.Add("Descrição");
          table.Columns.Add("Fabricante");
          table.Rows.Add("1","PRODUTO A","X");
          table.Rows.Add("2", "PRODUTO B", "X");
          table.Rows.Add("3", "PRODUTO C", "Y");
          table.Rows.Add("4", "PRODUTO D", "Z");
          table.Rows.Add("5", "PRODUTO E", "W");
    

    O que eu preciso é dos produtos agrupados por fabricante, montei a seguinte consulta:

    List<IGrouping<String, String>> produtos;
          produtos = from prd in table.Rows.Cast<IGrouping<String, String>>().GroupBy(member => table.Columns[3])
                select prd;
    

    A intenção é criar uma lista com os produtos agrupados por fabricante, só que deste jeito dá erro de conversão.

    Será que tem alguma forma mais simples de obter esta lista com os produtos agrupados?

    Obrigado

     

    quinta-feira, 26 de maio de 2011 02:47

Respostas

  • David,

    Como assim você quer agrupar produtos pelo fabricante? Você quer a quantidade de produtos por fabricante? Sempre que você utiliza um GroupBy é pra contar, somar, etc., itens por um determinado atributo... O que especificamente você está querendo fazer?

    Veja se este exemplo te ajuda em algo:

      public class Agrupamento
      {
        public Agrupamento()
        {
          List<GrupoProduto> grupoProduto = new List<GrupoProduto>();
          List<Produto> produto = new List<Produto>();
          List<PedidoProduto> pedidoProdutos = new List<PedidoProduto>();
    
          grupoProduto.Add(new GrupoProduto() { idGrupoProduto = 1, nome = "Grupo 1" });
          grupoProduto.Add(new GrupoProduto() { idGrupoProduto = 2, nome = "Grupo 2" });
          produto.Add(new Produto() { idProduto = 1, idGrupoProduto = 1, descricao = "Produto 1" });
          produto.Add(new Produto() { idProduto = 2, idGrupoProduto = 1, descricao = "Produto 2" });
          produto.Add(new Produto() { idProduto = 3, idGrupoProduto = 2, descricao = "Produto 3" });
          produto.Add(new Produto() { idProduto = 4, idGrupoProduto = 2, descricao = "Produto 4" });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 1, quantidade = 10, valor = 20 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 1, quantidade = 20, valor = 30 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 2, quantidade = 30, valor = 40 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 2, quantidade = 40, valor = 50 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 3, quantidade = 50, valor = 60 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 3, quantidade = 60, valor = 70 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 4, quantidade = 70, valor = 80 });
          pedidoProdutos.Add(new PedidoProduto() { idProduto = 4, quantidade = 80, valor = 90 });
    
    
          var resultado = from ped in pedidoProdutos
                  join prod in produto on ped.idProduto equals prod.idProduto
                  join grupoProd in grupoProduto on prod.idGrupoProduto equals grupoProd.idGrupoProduto
                  group ped by new 
                  {
                    prod.descricao,
                    grupoProd.nome
                  } into g
                  orderby g.Sum(p => p.quantidade) descending
                  select new 
                  {
                    Descricao = g.Key.descricao,
                    Nome = g.Key.nome,
                    SomaQuantidade = g.Sum(p => p.quantidade),
                    SomaValor = g.Sum(p => p.valor)
                  };
    
          foreach (var r in resultado)
          {
            MessageBox.Show(string.Format("Descricao = {0}\nNome = {1}\nSomaQuantidade = {2}\nSomaValor = {3}", r.Descricao, r.Nome, r.SomaQuantidade, r.SomaValor));
          }
        }
    
        private class PedidoProduto
        {
          public int idProduto;
          public double quantidade;
          public double valor;
        }
    
        private class Produto
        {
          public int idProduto;
          public string descricao;
          public int idGrupoProduto;
        }
    
        private class GrupoProduto
        {
          public int idGrupoProduto;
          public string nome;
        }
      }
    


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quinta-feira, 26 de maio de 2011 15:44
    Moderador