Warum übersetzt LINQ to SQL GroupBy in mehrere Abfragen?
Ich habe bemerkt, dass sogar meine einfacheren LINQ-Abfragen mit GroupBy in so viele SQL-Abfragen wie Gruppenschlüssel übersetzt werden. Ich habe keine Erklärung dafür gefunden, warum dies passiert oder wie ich es vermeiden kann.
Zum Beispiel die Abfrage:
from p in People group p by p.Name into g select g
wird in so viele übersetztselects
als unterschiedliche Werte für die SpalteName
, genau wie dieser:
-- Region Parameters
DECLARE @x1 VarChar(20) SET @x1 = 'John'
-- EndRegion
SELECT [t0].[Name], [t0].[SurName]
FROM [People] AS [t0]
WHERE ((@x1 IS NULL) AND ([t0].[Name] IS NULL))
OR ((@x1 IS NOT NULL) AND ([t0].[Name] IS NOT NULL) AND (@x1 = [t0].[Name]))
GO
Allerdings, wenn ich den ganzen Tisch in den Speicher bringe, zum Beispiel beim AufrufenAsEnumerable()
,
from p in People.AsEnumerable() group p by p.Name into g select g
Es wird nur eine einzige Auswahl ausgegeben, die alle Zeilen abruft, und dann führt LINQ die Gruppierung im Speicher durch.
Ich finde dieses Verhalten eher verwirrend und fehleranfällig, da ich häufig komplexe Abfragen in verschiedenen Anweisungen zusammenstelle und vorsichtig genug sein muss, um sie anzurufenAsEnumerable
oderToList
vor dem Ausführen von aGroupBy
oder meine Leistung verschlechtert sich. Schlimmer noch, es zwingt mich, meine zu beendenLINQ to SQL
abfragen und fortfahren mitLINQ to Objects
.
Ich habe dies beide mit getestetLINQ to Entities
undLINQ to SQL
(durchLINQPad
), wobei das DBMSSQL Server
.
Vermisse ich etwas? Ist dies beabsichtigt oder gibt es eine Möglichkeit, die LINQ-Abfrage so zu schreiben, dass SQLsGROUP BY
wird verwendet, anstatt mehrere Einzelabfragen zu generieren?