SQL to Entity Framework Count Group-By

Odpowiedzi:

181

Składnia zapytania

var query = from p in context.People
            group p by p.name into g
            select new
            {
              name = g.Key,
              count = g.Count()
            };

Składnia metody

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });
Aducci
źródło
22

Edycja: EF Core 2,1 w końcu obsługuje GroupBy

Ale zawsze szukaj komunikatów w konsoli / dzienniku. Jeśli zobaczysz powiadomienie, że Twoje zapytanie nie może zostać przekonwertowane na SQL i zostanie ocenione lokalnie, może być konieczne jego przepisanie.


Entity Framework 7 (teraz zmieniona na Entity Framework Core 1.0 / 2.0 ) nie obsługuje jeszcze GroupBy()tłumaczenia na GROUP BYw wygenerowanym SQL (nawet w ostatecznej wersji 1.0 nie będzie). Dowolna logika grupowania będzie działać po stronie klienta, co może spowodować załadowanie dużej ilości danych.

W końcu kod napisany w ten sposób automatycznie zacznie używać GROUP BY, ale na razie musisz być bardzo ostrożny, jeśli załadowanie całego niezgrupowanego zestawu danych do pamięci spowoduje problemy z wydajnością.

W scenariuszach, w których jest to łamanie umowy, będziesz musiał ręcznie napisać SQL i wykonać go za pomocą EF.

Jeśli masz wątpliwości, uruchom Sql Profiler i zobacz, co jest generowane - co i tak prawdopodobnie powinieneś zrobić.

https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2

Simon_Weaver
źródło
5
Dzięki za ostrzeżenie
Jacob Stamm,
4
Również brak grupowania w 1.1
Simon_Weaver
4
lub 1.2 lub 2.0.
Poddaję
4
jest ogłoszony na 2.1
Yush0
Może to być mylące, myślę, że ważne jest, aby zaktualizować swoją odpowiedź i wyraźnie wspomnieć, że wersje EF starsze niż EF 7 obsługują grupowanie. Ta odpowiedź, która jest bardziej komentarzem niż rzeczywistą odpowiedzią na pytanie PO, jest myląca, gdy się ją czyta (i jest interpretowana jako odpowiedź na PO, która nie jest). Czytając to, można odnieść złe wrażenie, jakby nawet EF 7 nie obsługiwał grupowania i oczywiście wcześniejsze wersje go nie obsługują, co jest po prostu nieprawdą.
BornToCode
14

Przydatnym rozszerzeniem jest zbieranie wyników w Dictionarycelu szybkiego wyszukiwania (np. W pętli):

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

Pierwotnie znaleziony tutaj: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c

Christian Moser
źródło
1

Oto prosty przykład grupowania według .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()};

Co przekłada się na:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]
Greg Gum
źródło
0

z EF 6.2 to zadziałało dla mnie

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
Nava Bogatee
źródło