visual studio online framework ejemplos consulta conexion c# sql-server linq linq-to-sql

c# - studio - ¿Por qué LINQ to SQL traduce GroupBy en múltiples consultas?



linq to sql visual studio 2017 (1)

Me di cuenta de que incluso mis consultas LINQ más simples utilizando GroupBy se traducen en tantas consultas SQL como claves de grupo. No he encontrado ninguna explicación de por qué sucede esto o cómo puedo evitarlo.

Por ejemplo, la consulta:

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

se traduce en tantas selects como valores diferentes para el Name de la columna, 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

Sin embargo, si traigo toda la tabla a la memoria, como llamar a AsEnumerable() ,

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

solo se emite una única selección, recuperando todas las filas y luego LINQ realiza la agrupación en la memoria.

Encuentro este comportamiento bastante confuso y propenso a errores, ya que a menudo me encuentro componiendo consultas complejas en diferentes declaraciones y debo ser lo suficientemente cuidadoso como para llamar a AsEnumerable o ToList antes de realizar un GroupBy o mi rendimiento se degrada. Peor aún, me obliga a terminar mi consulta de LINQ to SQL y continuar con LINQ to Objects .

He probado esto tanto con LINQ to Entities como con LINQ to SQL (a través de LINQPad ), el DBMS es SQL Server .

¿Me estoy perdiendo de algo? ¿Esto es por diseño o hay alguna forma de escribir la consulta LINQ de tal forma que se use GROUP BY SQL en lugar de generar múltiples consultas individuales?


Necesita cambiar su declaración de selección para que sea más amigable con SQL.

cambio: select g

a algo como esto:

select new { g.Key, Count = g.Count(), };