LINQ to SQL-Version von GROUP BY WITH ROLLUP

8

Ich versuche, altes SQL in LINQ to SQL umzuschreiben. Ich habe einen Sproc mit einer GROUP BY WITH ROLLUP, aber ich bin mir nicht sicher, was das LINQ-Äquivalent wäre. LINQ hat eine GroupBy, aber es sieht nicht so aus, als ob es ROLLUP unterstützt.

Ein vereinfachtes Beispiel für die Ergebnisse, die ich erhalten möchte, wäre etwa so:

%Vor%

Irgendwelche Ideen, wie ich diese Ergebnisse mit LINQ to SQL erhalten könnte?

    
Ecyrb 27.08.2009, 20:05
quelle

4 Antworten

10

Ich habe eine viel einfachere Lösung gefunden. Ich habe versucht, es komplizierter zu machen, als es sein musste. Anstatt 3-5 Klassen / Methoden zu benötigen, brauche ich nur eine Methode.

Grundsätzlich sortieren und gruppieren Sie sich selbst und rufen dann WithRollup() auf, um einen List<> der Artikel mit Zwischensummen und einer Gesamtsumme zu erhalten. Ich konnte nicht herausfinden, wie man die Untersummen und die Gesamtsumme auf der SQL-Seite erzeugt, also werden diese mit LINQ to Objects gemacht. Hier ist der Code:

%Vor%

Und ein Beispiel, wie man es benutzt:

%Vor%     
Ecyrb 09.09.2009, 19:34
quelle
4

Ich habe es! Eine generische GroupByWithRollup. Es gruppiert sich nur um zwei Spalten, könnte aber leicht erweitert werden, um mehr zu unterstützen. Ich werde wahrscheinlich eine andere Version haben, die drei Spalten akzeptiert. Die Schlüsselklassen / Methoden sind Grouping & lt; & gt ;, GroupByMany & lt; & gt; () und GroupByWithRollup & lt; & gt; (). Die Methoden SubTotal () und GrandTotal () sind Helfer, wenn Sie GroupByWithRollup & lt; & gt; () verwenden. Unten ist der Code, gefolgt von einem Beispiel für die Verwendung.

%Vor%

Und ein Anwendungsbeispiel:

%Vor%     
Ecyrb 31.08.2009 17:28
quelle
2

@Ecyrb, hallo von fünf Jahren später!

Ich kenne LINQ to SQL nur oberflächlich und nicht nur über LINQ (zu Objekten) hinaus. Da Sie jedoch ein "LINQ" -Tag getrennt von Ihrem "LINQ-2-SQL" -Tag haben, weil Sie hauptsächlich an den Ergebnissen interessiert sind (im Gegensatz zum Registrieren von Änderungen mit der Datenbank) und weil dies das einzige ist Eine echte relevante Ressource, die auftauchte, als ich auf der Suche nach einem LINQ-Äquivalent der "Rollup" -Gruppierungsfunktion von SQL Server googelte, werde ich meine eigene alternative Lösung für jeden anbieten, der heute ein ähnliches Bedürfnis hat.

Grundsätzlich besteht mein Ansatz darin, eine ".GroupBy (). ThenBy ()" verkettbare Syntax ähnlich der ".OrderBy (). ThenBy ()" -Syntax zu erstellen. Meine Erweiterung erwartet eine Sammlung von IGrouping-Objekten - das Ergebnis, das Sie durch die Ausführung von ".GroupBy ()" als Quelle erhalten. Es nimmt dann die Sammlung und entbündelt sie, um das ursprüngliche Objekt vor der Gruppierung zurückzuerhalten. Schließlich gruppiert er die Daten gemäß der neuen Gruppierungsfunktion neu, erzeugt einen weiteren Satz von IGrouping-Objekten und fügt die neu gruppierten Objekte in den Satz von Quellobjekten ein.

%Vor%

Sie können die Methode verwenden, um die Rollup-Logik des SQL-Servers zu vergleichen, indem Sie konstante Werte in den entsprechenden Bereich der Funktion ".ThenBy ()" eingeben. Ich bevorzuge den Null-Wert, weil es die flexibelste Konstante zum Casting ist. Die Umwandlung ist wichtig, weil die Funktion, die Sie sowohl in .GroupBy () als auch .ThenBy () verwenden, denselben Objekttyp ergeben muss. Wenn Sie die Variable "dataItems" verwenden, die Sie in Ihrer ersten Antwort am 31. August 2009 erstellt haben, sieht das folgendermaßen aus:

%Vor%

Sie können die Nullen in den ".ThenBy ()" Logiken durch "all" ersetzen, wie Sie es wünschen.

Sie könnten die Gruppierungsgruppen von SQL Server und möglicherweise Cube mit Hilfe von ".ThenBy ()" möglicherweise emulieren. Auch ".ThenBy ()" funktioniert gut für mich, und ich sehe keine Probleme damit, dass der Name der ".ThenBy ()" der ".OrderBy ()" Methode entspricht, da sie unterschiedliche Signaturen haben, aber wenn es Probleme gibt, möchten Sie vielleicht überlegen, es zu benennen ".ThenGroupBy ()".

Wie bereits erwähnt, verwende ich nicht Linq-to-SQL, aber ich verwende das Providersystem von F #, von dem ich verstehe, dass es Linq-to-SQL in vielerlei Hinsicht unter der Haube verwendet. Also habe ich meine Erweiterung für ein solches Objekt aus meinem F # -Projekt ausprobiert, und es funktioniert wie erwartet. Obwohl ich absolut keine Ahnung habe, ob das irgendetwas Interessantes in dieser Hinsicht bedeutet.

    
pwilcox 27.01.2015 19:13
quelle
0

Eine ziemlich interessante Lösung finden Sie hier

Ссылка

Es beschreibt, wie Groupbby von mehreren Eigenschaften ausgeführt wird. Ie:

%Vor%

Als Ergebnis erhalten Sie eine hierarchische Struktur, die einfach in eine flache Liste konvertiert werden kann.

    
Igor S 03.02.2017 08:31
quelle

Tags und Links