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() });
Aducci
fuente
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

Simon_Weaver
fuente
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
14

Una extensión útil es recopilar los resultados en una Dictionarybúsqueda rápida (por ejemplo, en un bucle):

var resultDict = _dbContext.Projects
    .Where(p => p.Status == ProjectStatus.Active)
    .GroupBy(f => f.Country)
    .Select(g => new { country = g.Key, count = g.Count() })
    .ToDictionary(k => k.country, i => i.count);

Encontrado originalmente aquí: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c

Christian Moser
fuente
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]
Greg Gum
fuente
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() });
Nava Bogatee
fuente