Wie finde ich mit Linq to SQL Min und Max einer Spalte in einer Tabelle?
Möchte ich finden den schnellsten Weg, um die min und max einer Spalte in einer Tabelle mit einem einzigen Linq to SQL-Rundreise. Also ich weiß, das wäre in zwei Rundfahrten an:
int min = MyTable.Min(row => row.FavoriteNumber);
int max = MyTable.Max(row => row.FavoriteNumber);
Ich weiß, dass ich verwenden können group
aber ich habe nicht ein group by
Klausel, ich will Aggregat über den gesamten Tisch! Und ich kann es nicht verwenden .Min, ohne die Gruppierung zuerst. Ich habe versucht dies:
from row in MyTable
group row by true into r
select new {
min = r.Min(z => z.FavoriteNumber),
max = r.Max(z => z.FavoriteNumber)
}
Aber, dass crazy group-Klausel scheint dumm, und die SQL macht es komplexer ist, als es sein muss.
So, gibt es eine Möglichkeit zu bekommen, die richtigen SQL aus?
EDIT: Diese Jungs versäumt zu: Linq to SQL: wie Aggregat ohne ein group by? ... lame Aufsicht durch LINQ-Designer, wenn es wirklich keine Antwort.
EDIT 2: ich sah meine eigene Lösung (mit der unsinnigen Konstante group by-Klausel im SQL Server Management Studio Ausführungsplan-Analyse, und es scheint mir, wie es ist identisch mit den plan-generiert von:
SELECT MIN(FavoriteNumber), MAX(FavoriteNumber)
FROM MyTable
so, es sei denn, jemand kann kommen mit einer einfacheren-oder-gleich-als-gute Antwort, ich denke, ich markieren Sie es als Antwort-von-mir. Gedanken?
InformationsquelleAutor der Frage Scott Stafford | 2010-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie gesagt in der Frage, scheint diese Methode tatsächlich zu erzeugen optimale SQL-code, so, während es sieht ein wenig squirrely in LINQ, es sollte eine optimale performance-wise.
InformationsquelleAutor der Antwort Scott Stafford
Konnte ich finden nur diese eine, die produziert etwas sauber zu sql noch nicht wirklich effektiv im Vergleich zu select min(val), max(val) from Tabelle:
sql
immer noch es ist eine weitere option für die Verwendung einer einzelnen Verbindung für beide min-und max-Abfragen (siehe Multiple Active Result Sets (MARS))
oder gespeicherte Prozedur..
InformationsquelleAutor der Antwort dh.
Ich bin nicht sicher, wie übersetzen Sie es in C# noch (ich arbeite dran)
Dies ist die Haskell-version
Die C# - version einbeziehen sollte
Aggregate
einige, wie (glaube ich).InformationsquelleAutor der Antwort Matt Ellen
Einer LINQ to SQL-Abfrage ist ein einzelner Ausdruck. Also, wenn Sie nicht äußern Sie Ihre Abfrage in einem einzigen Ausdruck (oder mag es nicht, wenn Sie das tun), dann müssen Sie nach anderen Optionen.
Gespeicherte Prozeduren, da Sie Anweisungen, aktivieren Sie zu diesem Zweck in einer single-round-trip. Sie müssen entweder zwei output-Parameter oder wählen Sie eine Ergebnismenge mit zwei Zeilen. So oder so, müssen Sie benutzerdefinierten code, zum Auslesen der gespeicherten Prozedur das Ergebnis.
(Ich persönlich nicht die Notwendigkeit sehen, um zu vermeiden, zwei round-trips hier. Es scheint wie eine vorzeitige Optimierung, vor allem, da Sie wahrscheinlich haben zu springen durch Reifen, es zu erhalten arbeitend. Nicht zu vergessen die Zeit, die Sie verbringen die Begründung dieser Entscheidung und die Erklärung der Lösung auf andere Entwickler.)
Anders ausgedrückt: Sie haben bereits Ihre eigene Frage beantwortet. "Ich kann Sie nicht verwenden .Min, ohne die Gruppierung zuerst", gefolgt von "crazy group-Klausel scheint dumm, und die SQL macht es komplexer ist, als es sein muss", sind Hinweise darauf, dass die einfache und leicht verständliche zwei-round-trip-Lösung ist der beste Ausdruck Ihrer Absicht (es sei denn, Sie schreiben von benutzerdefinierten SQL).
InformationsquelleAutor der Antwort Bryan Watts
Wählen Sie die gesamte Tabelle, und tun Sie Ihre min-und max-Operationen im Speicher:
Je nachdem, wie groß Ihr Datenbestand ist, dies könnte der Weg zu gehen, nicht schlagen Sie Ihre Datenbank mehr als einmal.
InformationsquelleAutor der Antwort roosteronacid