LINQ Group By with multiple fields in key

Asked

Viewed 311 times

1

How do I include the IdCategoria in addition to the category name in the Console of the first FOREACH?

        var lst = from p in BDProduto.produtos
                  join c in BDProduto.categorias
                  on p.IdCategoria equals c.IdCategoria
                  orderby p.Produto
                  group p by c.Categoria;

        foreach (var grupo in lst)
        {
            Console.WriteLine("Categoria: {0}, Itens: {1}", grupo.Key, grupo.Count());
            foreach (var prod in grupo)
            {
                Console.WriteLine("\t\tID: {0}, Produto: {1}", prod.IdProduto, prod.Produto);
            }
        }

1 answer

4


It’s not much of a secret:

    foreach (var grupo in lst)
    {
        Console.WriteLine("Categoria: {0}, Id da Categoria: {1}, Itens: {2}", grupo.Key.Categoria, grupo.Key.IdCategoria, grupo.Count());
        ...

Rather, group Produto by the whole object of Categoria:

var lst = from p in BDProduto.produtos
              join c in BDProduto.categorias
              on p.IdCategoria equals c.IdCategoria
              orderby p.Produto
              group p by c;

Or, using Extension Methods (prompted by comment):

var lst = BDProduto.produtos
          .Join(BDProduto.categorias, 
              p => p.IdCategoria,
              c => c.IdCategoria,
              (p, c) => new { Produto = p, Categoria = c })
          .OrderBy(j => j.Produto.Produto)
          .GroupBy(j => j.Categoria);
  • Thanks Gypsy, it worked out! How would she look using method syntax?

  • @Kellysoares I updated the answer.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.