Jak mogę wykonać GroupBy wiele kolumn w LINQ
Coś podobnego do tego w SQL:
SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>
Jak mogę przekonwertować to na 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
Próbka proceduralna
źródło
Ok mam to jako:
źródło
W przypadku grupowania według wielu kolumn spróbuj tego zamiast ...
W ten sam sposób możesz dodać kolumnę 3, kolumnę 4 itd.
źródło
Result
zawiera wszystkie zestawy danych powiązane ze wszystkimi kolumnami. Wielkie dzięki!Od wersji C # 7 można także używać krotek wartości:
lub
źródło
C # 7.1 lub nowszy przy użyciu
Tuples
iInferred tuple element names
(obecnie działa tylko zlinq to objects
i nie jest obsługiwany, gdy wymagane są drzewa wyrażeń, npsomeIQueryable.GroupBy(...)
. Problem z Github ):C # 3 lub wyższy przy użyciu
anonymous types
:źródło
Możesz także użyć krotki <> do silnie pogrupowanego grupowania.
źródło
Chociaż pytanie to dotyczy właściwości grupowania według klas, jeśli chcesz grupować wiele kolumn względem obiektu ADO (takiego jak DataTable), musisz przypisać swoje „nowe” elementy do zmiennych:
źródło
źródło
źródło
Linq.Enumerable.Aggregate()
tym nawet pozwala na grupowanie przez szereg dynamicznych właściwości:propertyValues.Aggregate((current, next) => current + " " + next)
..GroupBy(x => (x.MaterialID, x.ProductID))
źródło
zgrupuj x według nowego {x.Col, x.Col}
źródło
Należy zauważyć, że musisz wysłać obiekt dla wyrażeń Lambda i nie możesz użyć instancji dla klasy.
Przykład:
To się skompiluje, ale wygeneruje jeden klucz na cykl .
Jeśli nie chcesz nazwać kluczowych właściwości, a następnie je odzyskać, możesz to zrobić w ten sposób. Spowoduje to
GroupBy
poprawnie i zapewni kluczowe właściwości.źródło
W przypadku VB i anonimowego / lambda :
źródło