SQL Abfrage in LINQ Syntax umwandeln

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Ich werds morgen nochmal mit Verweis auf Sytem.Linq probieren.

    ErfinderDesRades schrieb:


    '... schau hier mal nach, welchen Datentyp itm hat!


    als ich View(0) definiert hatte, wurde das als Table1DataRow ausgewiesen. Also genau was man erwarten könnte, nur die "Verpackung" ist komisch.
    Ich denke dasselbe sollte die For Schleife bewirken, danke

    Wo ist eigentlich der Unterschied zwischen einer TabellennameDataRow und einer normalen DataRow? Die Spalten sind für die erste definiert, könnte ich mir denken. Aber wie verstehe ich die Spalten einer normalen DataRow, sind da keine oder können die beliebig sein? Also wenn ich erstere in zweitere konvertiere (geht das überhaupt?) lösche ich mir da irgendwie die Spaltenbezeichnungen?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Wo ist eigentlich der Unterschied zwischen einer TabellennameDataRow und einer normalen DataRow?
    Guck dir TabellennameDataRow im ObjectBrowser an, und guck auch in die Basisklasse.
    Da werden die Zusammenhänge klar.
    Vorrausgesetzt, du weisst, was Vererbung ist.
    ObjectBrowser habich dir schon gegeben, oder?
    Ansonsten nochmal: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Haudruferzappeltnoch schrieb:

    normalen DataRow
    Dieses unanständige Wort haste jetzt zweimal verwendet - pfui!
    Du meinst untypisierte DataRow. Also die Sorte DataRow, die du nie nie nie verwenden solltest - immer nur typisierte.
    Dass du "untypisiert" mit "normal" gleichsetzt ist ganz überhaupt kein gutes Zeichen.
    Typisierte DataRows seien der Normalfall - untypisierte sind die Ausnahme, die man allenfalls in besonderen Spezialfällen denn doch mal braucht, aber nur, wenn man sich schon ziemlich gut auskennt, und ein Prob hat, was anders nicht zu lösen ist.

    Haudruferzappeltnoch schrieb:

    Also wenn ich erstere in zweitere konvertiere
    Warum sollte man das tun?
    Warum was gutes in was schlechtes konvertieren?

    Aber guck Objectbrowser (bzw. stelle Fragen zum Thema: Vererbung)

    (ganz kurz: TabellennameRow erbt von DataRow - dassis der Witz)

    Haudruferzappeltnoch schrieb:

    lösche ich mir da irgendwie die Spaltenbezeichnungen?
    Nein, du machst sie nur unsichtbar für dich selbst und für den Compiler.
    Im Endeffekt dasselbe: du kannst sie nicht mehr im Code verwenden. Wie gesagt: Warum sollte man sowas tun?

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ja stimmt, die Zeitspalte muss da noch raus, sonst hätte ich da eh nichts gruppiert^^

    SQL-Abfrage

    1. Select BNr, Sum(Gesamt) as TGM from dtrobo where Zeit Between '2021-10-21 18:00:00' and '2021-10-22 18:00:00' Group By BNr


    So gibt er mir ja schon die Summe der Spalte 'Gesamt' von allen Datenzeilen, die ihre Zeit im angegebenen Zeitraum haben. Geht das in LINQ? Oder muss ich das per Schleife selber rechnen?
    Hast Du mal ein paar Beispieldaten? Denn bei SQL bin ich komplett raus.
    Du hast also ne DataTable dtrobo.
    Damit ist schon mal der Zeit-Filter erledigt: Dim TimeFilteredRows = dtrobo.Where(Function(x) x.Zeit >= #10/21/2001 18:00# AndAlso x.Zeit <= #10/22/2001 18:00#)
    Dann geht es weiter mit dem Gruppieren: Dim GroupedTimeFilteredRows = TimeFilteredRows.GroupBy(Function(x) x.BNr
    Nun hast Du alle zeitgefilterten Zeilen zusammen in einer Gruppe, die die gleiche BNr haben (was immer das auch sein mag).
    Jetzt kommt es drauf an, ob Du von den Gruppen nur die Gesamt-Summen haben willst (und sonst gar nichts) oder auch die Gruppen. Bei ersterem:
    Dim PureTotalSums = GroupedTimeFilteredRows.Select(Function(x) x.Sum(Function(y) y.Gesamt))
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also ich habs jetzt momentan so^^:

    VB.NET-Quellcode

    1. Dim result = From t In DS1.dtrobo Where t.Zeit <= Enddat AndAlso t.Zeit >= Startdat Select t.Gesamt
    2. For Each element In result
    3. TGM += element
    4. Next


    Mit

    VB.NET-Quellcode

    1. Dim result = From t In DS1.dtrobo Where t.Zeit <= Enddat AndAlso t.Zeit >= Startdat Select t.Sum(..)

    krieg ich noch nicht zum laufen, aber da hab ich ja auch noch nciht gruppiert, nur weiß ich garnicht was gruppieren ohne Aggregatfunktionen eigentlich macht.
    Bitte ein paar Beispieldaten und die daraus resultierenden Sollergebnisse. Denn Dein

    VB.NET-Quellcode

    1. For Each element In result
    2. TGM += element
    3. Next
    ergibt ja nur eine Endzahl. Was immer auch TGM bedeutet. Da kannste Dir aber auch das Gruppieren und Teil-Summieren sparen und einfach nur alle zeitgefilterten Zeilen hernehmen und deren Zeiten aufsummieren. Also da passt irgendwas von der Beschreibung her nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja das Endergebnis ist auch nur eine Zahl, in SQL kann ich ohne Gruppieren die Summe nicht über alle Zeilen bilden. Die BNr ist quasi bei allen Datensätzen gleich, weil schon vorgefiltert. Brauch ich halt zum Gruppieren

    Also
    BNr
    Gesamt
    Zeit
    101
    12
    2021-10-22 12:30:00
    101
    14
    2021-10-22 12:30:00
    101
    23
    2021-10-22 12:30:00
    101
    21
    2021-08-10 15:50:00
    Da krieg ich dann 39 49raus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ja wenn man annimmt das diese Tabelle 'dtrobo' heißt dann ist das:

    SQL-Abfrage

    1. ​Select Sum(Gesamt) from dtrobo where Zeit Between '2021-10-21T18:00:00' and '2021-10-22T18:00:00' Group By BNr


    Dann kommt 49 raus sorry hab mich verrechnet xD. Also 12+14+23. Die 21 nicht denn die liegt nicht in der Zeit.
    Oben hatte ich halt die BNr noch mit angegeben. Und ich hatte da das Datum ohne 'T'-Trennung, das funktioniert in Mysql. Ich glaube in MSSQL braucht man das T
    Ok vielleicht bleibt ich dann erstmal beim manuellen addieren.

    Funktioniert denn Distinct in LINQ wie in SQL? Also Zeilen, die in allen Spalten übereinstimmen werden jeweilig auf eine Repräsentantenzeile reduziert?
    Wo würde ich das einbauen in einem bestehenden LINQ? In SQL steht Distinct hinter Select, aber Select steht da ja am Anfang und in LINQ am Ende. Einfach hinten dran hängen?