SQL to Entity Framework Count Group-By


Risposte:


190

Sintassi della query

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

Sintassi del metodo

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

22

Modifica: EF Core 2.1 supporta finalmente GroupBy

Ma fai sempre attenzione alla console / registro per i messaggi. Se viene visualizzata una notifica che indica che la query non può essere convertita in SQL e verrà valutata localmente, potrebbe essere necessario riscriverla.


Entity Framework 7 (ora rinominato Entity Framework Core 1.0 / 2.0 ) non supporta ancora la GroupBy()traduzione GROUP BYin SQL generato (anche nella versione 1.0 finale non lo farà). Qualsiasi logica di raggruppamento verrà eseguita sul lato client, il che potrebbe causare il caricamento di molti dati.

Alla fine il codice scritto in questo modo inizierà automaticamente a utilizzare GROUP BY, ma per ora devi essere molto cauto se il caricamento dell'intero set di dati non raggruppato in memoria causerà problemi di prestazioni.

Per gli scenari in cui questo è un problema, dovrai scrivere l'SQL a mano ed eseguirlo tramite EF.

In caso di dubbio, avvia Sql Profiler e guarda cosa viene generato, cosa che probabilmente dovresti fare comunque.

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


6
Grazie per l'avviso
Jacob Stamm

4
Inoltre nessun raggruppamento in 1.1
Simon_Weaver

5
o 1.2 o 2.0. Mi arrendo
Simon_Weaver

4
è annunciato per 2.1
Yush0

Questo può essere fuorviante, penso che sia importante aggiornare la tua risposta e menzionare esplicitamente che le versioni di EF precedenti a EF 7 supportano il raggruppamento. Questa risposta che è più un commento che una risposta reale alla domanda del PO è fuorviante se letta da sola (ed è interpretata come risposta al PO che non lo è). Durante la lettura, si potrebbe avere l'impressione sbagliata come se anche EF 7 non supportasse il raggruppamento e ovviamente le versioni precedenti non lo supportassero, il che non è vero.
BornToCode


3

Ecco un semplice esempio di group by in .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()};

Che si traduce in:

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

0

con EF 6.2 ha funzionato per me

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.