none
LINQ Abfrage mit Summierung und Gruppierung nach zwei Spalten RRS feed

  • 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 B

    Bis 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

    Donnerstag, 3. März 2016 15:18

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
    Dienstag, 8. März 2016 08:48

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
    Donnerstag, 3. März 2016 15:59
    Moderator
  • 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.

    Freitag, 4. März 2016 08:28
  • 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
    Dienstag, 8. März 2016 08:48
  • Hallo,

    zu der Abfrage in vorigen Post würde ich nun noch gern das ganze nach der Menge sortiert ausgegeben bekommen. Leider scheitere ich wieder daran, die ORDER BY Funktion an die o.g. Anfrage dranzuhängen.

    Hat jemand von Euch eine Idee?

    Mittwoch, 9. März 2016 14:59
  • 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

    Mittwoch, 9. März 2016 16:18
    Moderator