Ich muss diese SQL
-Anweisung in eine Linq-Entity
-Abfrage übersetzen ...
SELECT name, count(name) FROM people
GROUP by name
Abfragesyntax
var query = from p in context.People
group p by p.name into g
select new
{
name = g.Key,
count = g.Count()
};
Methodensyntax
var query = context.People
.GroupBy(p => p.name)
.Select(g => new { name = g.Key, count = g.Count() });
Aber immer in der Konsole/Protokoll nach Nachrichten suchen. Wenn Sie eine Benachrichtigung sehen, 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 umbenannt in Entity Framework Core 1.0/2.0) unterstützt GroupBy()
noch nicht für die Übersetzung in GROUP BY
in der generierten SQL (selbst in der letzten Version 1.0 wird dies nicht). Jede Gruppierungslogik wird auf der Clientseite ausgeführt, wodurch möglicherweise viele Daten geladen werden.
Möglicherweise wird Code, der auf diese Weise geschrieben wurde, automatisch mit GROUP BY gestartet, aber vorerst müssen Sie sehr vorsichtig sein, wenn das Laden Ihres gesamten nicht gruppierten Datasets in den Speicher zu Leistungsproblemen führt.
Für Szenarien, in denen dies ein Deal-Breaker ist, müssen Sie die SQL von Hand schreiben und über EF ausführen.
Wenn Sie Zweifel haben, starten Sie den Sql Profiler und sehen Sie, was generiert wird - was Sie wahrscheinlich trotzdem tun sollten.
https://blogs.msdn.Microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2
Eine nützliche Erweiterung ist das Sammeln der Ergebnisse in einer Dictionary
für eine schnelle Suche (z. B. in einer Schleife):
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: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c
mit EF 6.2 hat es für mich funktioniert
var query = context.People
.GroupBy(p => new {p.name})
.Select(g => new { name = g.Key.name, count = g.Count() });
Hier ist ein einfaches Beispiel für 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()};
Was übersetzt in:
SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]