Usuário com melhor resposta
Group By + Linq

Pergunta
-
Estou com problema para criar um group by com linq, Gostaria de criar o group by com mais de uma chave
e nao so uma como esta no exemplo:
var lotes = from l in context.Lotes
group l.quantidade by l.Produtos.nome into grouping
select new { Produto = grouping.Key, Total = grouping.Sum() };nao sei se seria possivel criar algo com mais de uma chave
como esta em sql
SELECT Produtos.nome,
Cores.nome AS Cor,
Unidades.nome AS Unidades,
SUM( Lotes.quantidade) AS Quantidade
FROM Lotes INNER JOIN
Produtos ON Lotes.id_Produto = Produtos.id INNER JOIN
Unidades ON Unidades.id = Produtos.id_Unidade INNER JOIN
Cores ON Cores.id = Produtos.id_cor
GROUP BY Produtos.nome, Cores.nome, Unidades.nome- Movido AndreAlvesLimaModerator quinta-feira, 14 de abril de 2011 11:52 (De:Windows Forms & Smart Client)
Respostas
-
Fabiano,
Só complementando a resposta do Julio, no seu caso, ao invés de fazer um group x by alguma coluna, você poderia fazer um group x by new { colunas que você quiser agrupar }... Então, a query LINQ correspondente ao TSQL que você postou ficaria mais ou menos assim (não testei então pode ter algum errinho de sintaxe):
var resultado = from l in context.Lotes join p in context.Produtos on l.id_Produto equals p.id join u in context.Unidades on p.id_Unidade equals u.id join c in context.Cores on p.id_cor equals c.id group l by new { NomeProduto = p.nome, NomeCor = c.nome, NomeUnidade = u.nome } into g select new { g.Key.NomeProduto, g.Key.NomeCor, g.Key.NomeUnidade Quantidade = g.Sum(l => l.quantidade) };
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Sugerido como Resposta AndreAlvesLimaModerator sábado, 30 de abril de 2011 13:24
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 13 de maio de 2011 18:27
-
Bom dia Fabiano,
Confira os exemplos abaixo, creio que a sua resposta está aqui:
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
http://stackoverflow.com/questions/442425/nested-group-by-in-linq
Espero ter sanado a sua dúvida!Se a resposta foi útil pra você, colabore com o fórum marcando como resposta esta sugestão, obrigado!
Júlio Cesar Cosmo, MCP, MCTS - Influenciador Sharepoint, Influenciadores Microsoft
http://juliocosmo.wordpress.com- Sugerido como Resposta Julio Cesar Cosmo, MCP, MCTS quinta-feira, 14 de abril de 2011 11:20
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 13 de maio de 2011 18:27
-
Vaza,
Como assim? Você poderia representar isso em uma sentença SQL? Se eu entendi direito o que você está querendo (SELECT * FROM TABELA GROUP BY ALGUMCAMPO), não seria possível conceitualmente falando...
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 13 de maio de 2011 18:27
Todas as Respostas
-
Bom dia Fabiano,
Confira os exemplos abaixo, creio que a sua resposta está aqui:
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
http://stackoverflow.com/questions/442425/nested-group-by-in-linq
Espero ter sanado a sua dúvida!Se a resposta foi útil pra você, colabore com o fórum marcando como resposta esta sugestão, obrigado!
Júlio Cesar Cosmo, MCP, MCTS - Influenciador Sharepoint, Influenciadores Microsoft
http://juliocosmo.wordpress.com- Sugerido como Resposta Julio Cesar Cosmo, MCP, MCTS quinta-feira, 14 de abril de 2011 11:20
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 13 de maio de 2011 18:27
-
Fabiano,
Só complementando a resposta do Julio, no seu caso, ao invés de fazer um group x by alguma coluna, você poderia fazer um group x by new { colunas que você quiser agrupar }... Então, a query LINQ correspondente ao TSQL que você postou ficaria mais ou menos assim (não testei então pode ter algum errinho de sintaxe):
var resultado = from l in context.Lotes join p in context.Produtos on l.id_Produto equals p.id join u in context.Unidades on p.id_Unidade equals u.id join c in context.Cores on p.id_cor equals c.id group l by new { NomeProduto = p.nome, NomeCor = c.nome, NomeUnidade = u.nome } into g select new { g.Key.NomeProduto, g.Key.NomeCor, g.Key.NomeUnidade Quantidade = g.Sum(l => l.quantidade) };
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Sugerido como Resposta AndreAlvesLimaModerator sábado, 30 de abril de 2011 13:24
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 13 de maio de 2011 18:27
-
Prezado(a),
Estou migrando seu post para o fórum de LINQ.
Por favor, das próximas vezes que tiver alguma dúvida relacionada a esse assunto, poste por lá.
Obrigado pelo apoio.
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Neste exemplo estamos agrupando os dados por Nome do produto, nome da cor e nome da unidade, mas conseguimos voltar no resultado apenas esses 3 campos. Vamos dizer que eu queria voltar todos os outros campos da entidade Produtos, isso eu não consigo, correto?
Seria uma limitação do Linq? Ou há alguma forma que eu possa agrupar uma entidade por um campo e conseguir retornar todos os outros campos da entidade?
E como fazer isso por métodos para que eu possa utilizar um ObjectDataSource?
-
Vaza,
Como assim? Você poderia representar isso em uma sentença SQL? Se eu entendi direito o que você está querendo (SELECT * FROM TABELA GROUP BY ALGUMCAMPO), não seria possível conceitualmente falando...
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 13 de maio de 2011 18:27
-