web-dev-qa-db-de.com

SQL für Entity Framework Group-By

Ich muss diese SQL-Anweisung in eine Linq-Entity-Abfrage übersetzen ...

SELECT name, count(name) FROM people
GROUP by name
66
fefwfefefwfwe

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

Edit: EF Core 2.1 unterstützt schließlich GroupBy

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

19
Simon_Weaver

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

11
Christian Moser

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

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]
0
Greg Gum