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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage