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?