Почему 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
используется вместо нескольких отдельных запросов?