Devo tradurre questa SQL
affermazione in una Linq-Entity
query ...
SELECT name, count(name) FROM people
GROUP by name
Devo tradurre questa SQL
affermazione in una Linq-Entity
query ...
SELECT name, count(name) FROM people
GROUP by name
Risposte:
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 BY
in 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
Un'estensione utile è raccogliere i risultati in un file Dictionary
ricerca rapida (ad esempio in un ciclo):
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);
Originariamente trovato qui: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
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]
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() });