1184 Stimmen

Gruppieren nach mehreren Spalten

Wie kann ich GroupBy mehrere Spalten in LINQ tun

Etwas Ähnliches wie dies in SQL:

SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>

Wie kann ich dies in 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

1392voto

leppie Punkte 111830

Verwenden Sie einen anonymen Typ.

Zum Beispiel

group x by new { x.Column1, x.Column2 }

37 Stimmen

Wenn Sie mit der Gruppierung mit anonymen Typen noch nicht vertraut sind, ist die Verwendung des Schlüsselworts "new" in diesem Beispiel genau das Richtige für Sie.

8 Stimmen

Im Falle von mvc mit nHibernate erhalten Fehler für dll Probleme. Das Problem wurde durch GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new { Key1 = key.Column1, Key2 = key.Column2 , Result = group.ToList() }) gelöst;

0 Stimmen

Ich dachte, in diesem Fall würden die neuen Objekte durch einen Verweis verglichen, also keine Übereinstimmung - keine Gruppierung.

931voto

Mo0gles Punkte 9967

Verfahrensmuster:

.GroupBy(x => new { x.Column1, x.Column2 })

0 Stimmen

Von welchem Typ ist das zurückgegebene Objekt?

6 Stimmen

@MGG_Soft das wäre ein anonymer Typ

0 Stimmen

Dieser Code funktioniert bei mir nicht: "Ungültiger anonymer Typendeklarator".

537voto

Sreedhar Punkte 27711

Ok, ich habe das als:

var query = (from t in Transactions
             group t by new {t.MaterialID, t.ProductID}
             into grp
                    select new
                    {
                        grp.Key.MaterialID,
                        grp.Key.ProductID,
                        Quantity = grp.Sum(t => t.Quantity)
                    }).ToList();

90 Stimmen

+1 - Danke für das ausführliche Beispiel. Die Schnipsel der anderen Antworten sind zu kurz und ohne Kontext. Außerdem zeigen Sie eine Aggregatfunktion (in diesem Fall Summe). Sehr hilfreich. Ich finde, dass die Verwendung einer Aggregatfunktion (d. h. MAX, MIN, SUM usw.) neben der Gruppierung ein häufiges Szenario ist.

0 Stimmen

Hier : stackoverflow.com/questions/14189537/ Es wird für eine Datentabelle gezeigt, wenn die Gruppierung auf einer einzelnen Spalte basiert, deren Name bekannt ist, aber wie kann es gemacht werden, wenn die Spalten, auf denen die Gruppierung basieren soll, dynamisch erzeugt werden müssen?

0 Stimmen

Dies ist sehr hilfreich für das Verständnis des Konzepts der Gruppierung und der Anwendung der Aggregation auf diese.

205voto

Milan Punkte 2815

Versuchen Sie für die Gruppierung nach mehreren Spalten stattdessen Folgendes...

GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new 
{ 
  Key1 = key.Column1,
  Key2 = key.Column2,
  Result = group.ToList() 
});

Auf die gleiche Weise können Sie Spalte3, Spalte4 usw. hinzufügen.

7 Stimmen

Das war sehr hilfreich und sollte viel mehr Bewertungen erhalten! Result enthält alle Datensätze, die mit allen Spalten verknüpft sind. Herzlichen Dank!

1 Stimmen

Hinweis: Ich musste .AsEnumerable() anstelle von ToList() verwenden.

1 Stimmen

Großartig, vielen Dank dafür. Hier ist mein Beispiel. Beachten Sie, dass GetFees ein IQueryable<Fee> RegistryAccountDA.GetFees(registryAccountId, fromDate, toDate) .GroupBy(x => new { x.AccountId, x.FeeName }, (key, group) => new { AccountId = key.AccountId, FeeName = key.FeeName, AppliedFee = group.Sum(x => x.AppliedFee) ?? 0M }).ToList();

52voto

Seit C# 7 können Sie auch Werttupel verwenden:

group x by (x.Column1, x.Column2)

o

.GroupBy(x => (x.Column1, x.Column2))

2 Stimmen

Nun, ich glaube, es fehlt ein zusätzliches ) am Ende. Sie schließen das () nicht.

0 Stimmen

Ich habe es hinzugefügt.

4 Stimmen

.GroupBy(x => new { x.Column1, x.Column2})

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X