Como posso fazer GroupBy várias colunas no LINQ
Algo semelhante a isso no SQL:
SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>
Como posso converter isso para LINQ:
QuantityBreakdown
(
MaterialID int,
ProductID int,
Quantity float
)
INSERT INTO @QuantityBreakdown (MaterialID, ProductID, Quantity)
SELECT MaterialID, ProductID, SUM(Quantity)
FROM @Transactions
GROUP BY MaterialID, ProductID
Amostra processual
fonte
Ok, entendi como:
fonte
Para Agrupar por várias colunas, tente fazer isso ...
Da mesma maneira que você pode adicionar Coluna3, Coluna4 etc.
fonte
Result
contém todos os conjuntos de dados vinculados a todas as colunas. Muito obrigado!Desde o C # 7, você também pode usar tuplas de valor:
ou
fonte
C # 7.1 ou superior usando
Tuples
andInferred tuple element names
(atualmente funciona apenas comlinq to objects
e não é suportado quando árvores de expressão são necessárias, por exemplosomeIQueryable.GroupBy(...)
. Problema no Github ):C # 3 ou superior usando
anonymous types
:fonte
Você também pode usar uma Tupla <> para um agrupamento fortemente tipado.
fonte
Embora esta pergunta esteja perguntando sobre agrupar por propriedades de classe, se você deseja agrupar por várias colunas em um objeto ADO (como uma DataTable), você deve atribuir seus "novos" itens a variáveis:
fonte
fonte
fonte
Linq.Enumerable.Aggregate()
isso ainda permite agrupar por um número dinâmico de propriedades:propertyValues.Aggregate((current, next) => current + " " + next)
..GroupBy(x => (x.MaterialID, x.ProductID))
fonte
agrupar x por novos {x.Col, x.Col}
fonte
Um ponto a ser observado é que você precisa enviar um objeto para expressões Lambda e não pode usar uma instância para uma classe.
Exemplo:
Isso será compilado, mas gerará uma chave por ciclo .
Se você não quiser nomear as propriedades-chave e depois recuperá-las, poderá fazê-lo assim. Isso funcionará
GroupBy
corretamente e fornecerá as principais propriedades.fonte
Para VB e anônimo / lambda :
fonte