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

9

Eu notei que até mesmo minhas consultas LINQ mais simples usando GroupBy são traduzidas em tantas consultas SQL como chaves de grupo. Eu 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 em quantos selects como valores diferentes para a coluna Name , 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 colocar toda a tabela na memória, como chamar AsEnumerable() ,

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, em seguida, o LINQ executa o agrupamento na memória.

Acho esse comportamento bastante confuso e propenso a erros, pois muitas vezes me vejo compondo consultas complexas em declarações diferentes e preciso ser cuidadoso o suficiente para chamar AsEnumerable ou ToList antes de executar um GroupBy ou meu desempenho é prejudicado . Pior ainda, isso me obriga a terminar minha consulta LINQ to SQL e continuar com LINQ to Objects .

Eu testei isso usando LINQ to Entities e LINQ to SQL (através de LINQPad ), sendo o DBMS SQL Server .

Estou faltando alguma coisa? Isso é por design ou existe alguma maneira de gravar a consulta LINQ de tal forma que GROUP BY do SQL é usado em vez de várias consultas individuais sendo geradas?

    
por jnovo 02.04.2014 в 17:45
fonte

1 resposta

2

Você precisa alterar sua instrução select para que seja mais amigável ao SQL.

alteração: select g

para algo assim:

select new
{
  g.Key,
  Count = g.Count(),
};
    
por Aducci 02.04.2014 / 19:21
fonte