Почему LINQ to SQL переводит GroupBy в несколько запросов

Я заметил, что даже мои более простые запросы LINQ, использующие GroupBy, переводятся в столько же запросов SQL, сколько групповых ключей. Я не нашел никакого объяснения относительно того, почему это происходит или как я могу избежать этого.

Например, запрос:

from p in People group p by p.Name into g select g

переводится как можно большеselects как разные значения для столбцаNameтак же, как этот:

-- 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

Однако, если я приведу всю таблицу в память, например, вызовAsEnumerable(),

from p in People.AsEnumerable() group p by p.Name into g select g

выдается только один выбор, извлекающий все строки, а затем LINQ выполняет группировку в памяти.

Я нахожу это поведение довольно запутанным и подверженным ошибкам, поскольку я часто сочиняю сложные запросы в разных выражениях, и я должен быть достаточно осторожным, чтобы вызватьAsEnumerable или жеToList перед выполнениемGroupBy или моя производительность ухудшается. Еще хуже, это заставляет меня закончитьLINQ to SQL запросить и продолжить сLINQ to Objects.

Я проверил это как с помощьюLINQ to Entities а такжеLINQ to SQL (черезLINQPad), причем СУБДSQL Server.

Я что-то пропустил? Это сделано намеренно или есть какой-либо способ написать запрос LINQ таким образом, чтобы SQLGROUP BY используется вместо нескольких отдельных запросов?

Ответы на вопрос(1)

Ваш ответ на вопрос