Anzahl der SQL-zu-Entity-Framework-Gruppierung nach


Antworten:


179

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

22

Bearbeiten: EF Core 2.1 unterstützt endlich GroupBy

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 BYin 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


5
Vielen Dank für die Heads-Ups
Jacob Stamm

4
Auch keine Gruppierung in 1.1
Simon_Weaver

4
oder 1,2 oder 2,0. Ich gebe auf
Simon_Weaver

4
es wird für 2.1
Yush0

Dies kann irreführend sein. Ich denke, es ist wichtig, Ihre Antwort zu aktualisieren und ausdrücklich zu erwähnen, dass EF-Versionen vor EF 7 die Gruppierung unterstützen. Diese Antwort, die eher ein Kommentar als eine tatsächliche Antwort auf die OP-Frage ist, ist irreführend, wenn sie von sich aus gelesen wird (und wird als Antwort auf das OP interpretiert, die es nicht ist). Wenn man dies liest, könnte man den falschen Eindruck bekommen, als ob selbst EF 7 keine Gruppierung unterstützt und offensichtlich frühere Versionen dies nicht unterstützen, was einfach nicht wahr ist.
BornToCode

14

Eine nützliche Erweiterung besteht darin, die Ergebnisse in a Dictionaryfü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


1

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]

0

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() });
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.