Ich muss diese SQL
Aussage in eine Linq-Entity
Abfrage übersetzen ...
SELECT name, count(name) FROM people
GROUP by name
Ich muss diese SQL
Aussage in eine Linq-Entity
Abfrage übersetzen ...
SELECT name, count(name) FROM people
GROUP by name
Antworten:
Achten Sie jedoch immer in der Konsole / im Protokoll auf Nachrichten. Wenn Sie eine Benachrichtigung erhalten, dass Ihre Abfrage nicht in SQL konvertiert werden konnte und lokal ausgewertet wird, müssen Sie sie möglicherweise neu schreiben.
Entity Framework 7 (jetzt in Entity Framework Core 1.0 / 2.0 umbenannt ) unterstützt die GroupBy()
Übersetzung GROUP BY
in generiertes SQL noch nicht (selbst in der endgültigen Version 1.0 wird dies nicht der Fall sein ). Jede Gruppierungslogik wird auf der Clientseite ausgeführt, wodurch möglicherweise viele Daten geladen werden.
Irgendwann wird Code, der so geschrieben wurde, automatisch mit GROUP BY verwendet. Im Moment müssen Sie jedoch sehr vorsichtig sein, wenn das Laden Ihres gesamten nicht gruppierten Datasets in den Speicher zu Leistungsproblemen führt.
In Szenarien, in denen dies ein Deal-Breaker ist, müssen Sie die SQL von Hand schreiben und über EF ausführen.
Starten Sie im Zweifelsfall den SQL Profiler und sehen Sie, was generiert wird - was Sie wahrscheinlich sowieso tun sollten.
https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2
Eine nützliche Erweiterung besteht darin, die Ergebnisse in a Dictionary
für eine schnelle Suche (z. B. in einer Schleife) zu sammeln :
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);
Ursprünglich hier gefunden: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
Hier ist ein einfaches Beispiel für die Gruppierung nach 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()};
Was bedeutet:
SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]
mit EF 6.2 hat es bei mir funktioniert
var query = context.People
.GroupBy(p => new {p.name})
.Select(g => new { name = g.Key.name, count = g.Count() });