Por que o LINQ to SQL converte o GroupBy em várias consultas

Percebi que mesmo minhas consultas LINQ mais simples usando o GroupBy são convertidas em tantas consultas SQL quanto em chaves de grupo. Não encontrei nenhuma explicação sobre por que isso acontece ou como posso evitá-lo.

Por exemplo, a consulta:

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

é traduzido para o maior númeroselects como valores diferentes para a colunaName, assim como este:

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

No entanto, se eu trazer a tabela inteira para a memória, como chamarAsEnumerable(),

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

apenas uma única seleção é emitida, recuperando todas as linhas e o LINQ executa o agrupamento na memória.

Acho esse comportamento bastante confuso e propenso a erros, já que muitas vezes me vejo compondo consultas complexas em diferentes instruções e devo ter cuidado o suficiente para chamarAsEnumerable ouToList antes de executar umaGroupBy ou meu desempenho fica degradado. Pior ainda, me obriga a terminar meuLINQ to SQL consulte e continue comLINQ to Objects.

Eu testei isso tanto usandoLINQ to Entities eLINQ to SQL (atravésLINQPad), sendo o DBMSSQL Server.

Estou esquecendo de algo? Isso ocorre por design ou existe alguma maneira de gravar a consulta LINQ de maneira que o SQLGROUP BY é usado em vez de várias consultas individuais serem geradas?

questionAnswers(1)

yourAnswerToTheQuestion