Підрахунок SQL до Entity Framework за групою


Відповіді:


180

Синтаксис запиту

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

Синтаксис методу

var query = context.People
                   .GroupBy(p => p.name)
                   .Select(g => new { name = g.Key, count = g.Count() });

22

Редагувати: EF Core 2.1 нарешті підтримує GroupBy

Але завжди слідкуйте за повідомленнями в консолі / журналі. Якщо ви бачите сповіщення про те, що ваш запит не вдалося перетворити на SQL і буде оцінений локально, можливо, вам доведеться його переписати.


Entity Framework 7 (тепер перейменований на Entity Framework Core 1.0 / 2.0 ) ще не підтримує GroupBy()переклад GROUP BYу згенерований SQL (навіть у остаточному випуску 1.0 це не буде). Будь-яка логіка групування працюватиме на стороні клієнта, що може спричинити завантаження великої кількості даних.

Згодом написаний таким чином код автоматично почне використовувати GROUP BY, але наразі потрібно бути дуже обережним, якщо завантаження у пам’ять всього негрупованого набору даних спричинить проблеми з продуктивністю.

У сценаріях, коли це вимикач угод, вам доведеться написати SQL вручну і виконати його за допомогою EF.

Якщо ви сумніваєтеся, запустіть Sql Profiler і подивіться, що згенеровано - що ви, мабуть, все одно повинні робити.

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


5
Дякую за голови
Джейкоб Штамм

4
Також немає групування в 1.1
Simon_Weaver

4
або 1,2 або 2,0. Я
здаюся

4
він оголошений на 2.1
Юш0

Це може ввести в оману, я вважаю важливим оновити свою відповідь і прямо вказати, що версії EF, які передують EF 7, підтримують групування. Ця відповідь, яка є скоріше коментарем, ніж фактичною відповіддю на питання ОП, вводить в оману, коли сама по собі її читає (і трактується як відповідь на ОП, яка не є). Читаючи це, можна скласти неправильне враження, ніби навіть EF 7 не підтримує групування, і, очевидно, попередні версії не підтримують це, що просто не відповідає дійсності.
BornToCode

14

Корисним розширенням є збір результатів Dictionaryдля швидкого пошуку (наприклад, у циклі):

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

Спочатку знайдено тут: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c


1

Ось простий приклад групування в .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()};

Що означає:

SELECT [n].[AppUserId], COUNT(*) AS [Count]
FROM [Notifications] AS [n]
WHERE [n].[Sent] = 0
GROUP BY [n].[AppUserId]

0

з EF 6.2 це спрацювало у мене

  var query = context.People
               .GroupBy(p => new {p.name})
               .Select(g => new { name = g.Key.name, count = g.Count() });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.