Recuento de SQL a Entity Framework Group-By


Respuestas:


181

Sintaxis de la consulta

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

Sintaxis del método

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

Editar: EF Core 2.1 finalmente es compatible con GroupBy

Pero siempre busque mensajes en la consola / registro. Si ve una notificación de que su consulta no se pudo convertir a SQL y se evaluará localmente, es posible que deba volver a escribirla.


Entity Framework 7 (ahora renombrado a Entity Framework Core 1.0 / 2.0 ) aún no admite la GroupBy()traducción a GROUP BYSQL generado (incluso en la versión final 1.0 no lo hará). Cualquier lógica de agrupación se ejecutará en el lado del cliente, lo que podría provocar que se carguen muchos datos.

Con el tiempo, el código escrito como este comenzará a usar automáticamente GROUP BY, pero por ahora debe tener mucho cuidado si cargar todo su conjunto de datos no agrupado en la memoria causará problemas de rendimiento.

Para escenarios en los que esto es un factor decisivo, tendrá que escribir el SQL a mano y ejecutarlo a través de EF.

En caso de duda, inicie Sql Profiler y vea qué se genera, lo que probablemente debería estar haciendo de todos modos.

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2


5
Gracias por el aviso
Jacob Stamm

4
Tampoco se agrupa en 1.1
Simon_Weaver

4
o 1.2 o 2.0. Me
rindo

4
se anuncia para 2.1
Yush0

Esto puede ser engañoso, creo que es importante actualizar su respuesta y mencionar explícitamente que las versiones de EF anteriores a EF 7 admiten la agrupación. Esta respuesta, que es más un comentario que una respuesta real a la pregunta del OP, es engañosa cuando se lee por sí misma (y se interpreta como una respuesta al OP que no lo es). Al leer esto, uno podría tener la impresión incorrecta de que incluso EF 7 no admite la agrupación y, obviamente, las versiones anteriores no lo admiten, lo que simplemente no es cierto.
BornToCode


1

Aquí hay un ejemplo simple de agrupar en .net core 2.1

var query = this.DbContext.Notifications.
            Where(n=> n.Sent == false).
            GroupBy(n => new { n.AppUserId })
            .Select(g => new { AppUserId = g.Key, Count =  g.Count() });

var query2 = from n in this.DbContext.Notifications
            where n.Sent == false
            group n by n.AppUserId into g
            select new { id = g.Key,  Count = g.Count()};

Lo que se traduce en:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

0

con EF 6.2 funcionó para mí

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.