How to group by 2 properties and add the values

3

I have no idea how to do this query in LINQ. How can I from sales list. Separate sales per hour, and then group the products and add up the quantities sold?

 public class Venda
 {
   public int Id {get;set;}
   public DateTime DataHora {get;set;}
   public List<ProdutoVendido> ProdutosVendidos {get;set;}
 }

 public class ProdutoVendido
 {
   public Produto Produto {get;set;}
   public int Quantidade {get;set;}
 }

 public class Produto
 {
    public int Id {get;set;}
    public string Nome {get;set;}
 }

In SQL would look like this:

select hour(dthr_venda), nm_produto, sum(cd_qt) from produto_e_venda
join venda using(cd_venda)
join produto using (cd_produto)
group by cd_produto, hour(dthr_venda)
order by 1;
    
asked by anonymous 12.06.2014 / 17:45

1 answer

2

The query to group each product per hour and calculate the quantities sold will be:

var vendasPorProduto = vendas.GroupBy(v => v.DataHora.Hour)
                                .Select(g => new
                                    {
                                        Hora = g.Key,
                                        ProdutosDetalhados = g.SelectMany(v => v.ProdutosVendidos)
                                                            .GroupBy(pv => pv.Produto)
                                                            .Select(v => new
                                                                {
                                                                    Produto = v.Key,
                                                                    Quantidade = v.Sum(pv => pv.Quantidade)
                                                                })
                                    });

Extra:

If you want to calculate the totality of products sold in an hour (it was the byproduct to answer your question):

var todosProdutosPorHora = vendas.GroupBy(v => v.DataHora.Hour)
                                    .Select(g => new
                                        {
                                            Hora = g.Key,
                                            Total = g.Sum(venda =>
                                                        venda.ProdutosVendidos.Sum(pv => pv.Quantidade))
                                        });
    
12.06.2014 / 21:15