Benutzer mit den meisten Antworten
LINQ Abfrage mit Summierung und Gruppierung nach zwei Spalten

Frage
-
Hallo Gemeinde,
ich stehe vor einem Problem, was ich selbst nicht lösen kann. Ausgangspunkt ist eine Tabelle folgender Struktur:
Spalte A: Datum (Mehrfacheintragungen vorhanden)
Spalte B: Typ1 (Mehrfacheintragungen vorhanden)
Spalte C: Typ2 (Mehrfacheintragungen vorhanden)
Spalte D: Menge (Zahl)
Nun möchte ich per LINQ eine Abfrage, die im SQL so aussehen würde:
"SELECT Datum, Typ1, SUM(Menge) FROM ... GROUP BY Datum, Typ1"Herauskommen sollte folgendes Ergebnis:
Spalte A: Datum
Spalte B: Typ1
Spalte C: Summe der Menge, gruppiert nach Spalte A und BBis jetzt ist es mir gelungen zu summieren und nach Datum zu gruppieren. Aber nach zwei Spalten zu gruppieren hat nicht funktioniert.
Ich wäre über die LINQ Abfrage für VB dankbar.
Beste Grüße
Antworten
-
Nach einigem Probieren mit den Beispielen von MS bin ich fündig geworden. Mit folgender Abfrage funktioniert es:
Dim result = From x In lst Group By n = x!Datum, x!Typ1 Into group = Group, first = First() Select New With {.Datum = first!Datum, .Typ1 = first!Typ1, .Menge = group.Sum(Function(y) y.Field(Of Single)("Menge"))}
statt der Punkte sind Ausrufezeichen zu verwenden, dann geht es komischerweise. Vielleicht hilft es ja jemandem anders auch noch.
Grüße
- Als Antwort markiert FalkP78 Mittwoch, 9. März 2016 15:00
Alle Antworten
-
Hallo,
um nach mehreren Elementen zu gruppieren musst du nur mehrere Eigenschaften angeben. Im Select-Teil des LinQ-Ausdrucks kannst du dann auf die Elemente der Gruppen zugreifen. Das sieht in Schlüsselwort-Syntax in etwa so aus:
Dim result = From x In lst Group By n = x.Datum, x.Typ1 Into group = Group, first = First() Select New With {.Datum = first.Datum, .Typ1 = first.Typ1, .Menge = group.Sum(Function(y) y.Menge)}
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen David Stania Freitag, 4. März 2016 08:15
-
Hallo Tom,
danke für die Antwort. Leider erscheint bei bei x.Datum (und x.Typ1) der Fehler, dass Datum kein Member von System.DataRow ist.
Meine bisherige Abfrage (gruppiert nur nach Datum) sah wie folgt aus:
Dim query = From row In lst Group row By datum = row.Field(Of Date)("Datum") Into DatumGroup = Group Select New With {Key datum, .Menge = DatumGroup.Sum(Function(r) r.Field(Of Single)("Menge"))}
x.Datum kann ich mit x.Field(Of Date)("Datum") umschreiben, aber bei Typ1 funktioniert das nicht mit folgendem Fehler: "Der Name einer Bereichsvariablen kann nur von einem einfachen oder qualifizierten Namen ohne Argumente abgeleitet werden."
Hast Du noch Ideen für mich? Muss doch hinzukriegen sein...
Grüße.
-
Nach einigem Probieren mit den Beispielen von MS bin ich fündig geworden. Mit folgender Abfrage funktioniert es:
Dim result = From x In lst Group By n = x!Datum, x!Typ1 Into group = Group, first = First() Select New With {.Datum = first!Datum, .Typ1 = first!Typ1, .Menge = group.Sum(Function(y) y.Field(Of Single)("Menge"))}
statt der Punkte sind Ausrufezeichen zu verwenden, dann geht es komischerweise. Vielleicht hilft es ja jemandem anders auch noch.
Grüße
- Als Antwort markiert FalkP78 Mittwoch, 9. März 2016 15:00
-
Hallo,
entschuldige bitte meine späte Rückmeldung. Ich hatte das Wochenende echt viel zu tun und komme erst jetzt zu einer Antwort.
Warum du die Ausrufezeichen benutzen musst verstehe ich leider auch nicht. Aber ich bin auch kein VB(.NET) Experte.
Bezogen auf mein erstes Beispiel könnte das Order By so angewendet werden:
Dim result = From x In lst Group By n = x.Datum, x.Typ1 Into group = Group, first = First() Select y=New With {.Datum = first.Datum, .Typ1 = first.Typ1, .Menge = group.Sum(Function(y) y.Menge)} Order By y.Typ1
Also wirklich einfach hinten dran hängen
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets