SQL à Entity Framework Count Group-By

Réponses:

181

Syntaxe de la requête

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

Syntaxe de la méthode

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

Edit: EF Core 2.1 prend enfin en charge GroupBy

Mais recherchez toujours les messages dans la console / le journal. Si vous voyez une notification indiquant que votre requête n'a pas pu être convertie en SQL et qu'elle sera évaluée localement, vous devrez peut-être la réécrire.


Entity Framework 7 (désormais renommé Entity Framework Core 1.0 / 2.0 ) ne prend pas encore en charge la GroupBy()traduction GROUP BYen SQL généré (même dans la version 1.0 finale, ce n'est pas le cas). Toute logique de regroupement s'exécutera du côté client, ce qui pourrait entraîner le chargement d'un grand nombre de données.

Finalement, le code écrit comme celui-ci commencera automatiquement à utiliser GROUP BY, mais pour l'instant, vous devez être très prudent si le chargement de l'ensemble de votre ensemble de données non groupé en mémoire entraîne des problèmes de performances.

Pour les scénarios où il s'agit d'un deal-breaker, vous devrez écrire le SQL à la main et l'exécuter via EF.

En cas de doute, lancez Sql Profiler et voyez ce qui est généré - ce que vous devriez probablement faire de toute façon.

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

Simon_Weaver
la source
5
Merci pour la tête
Jacob Stamm
4
Aussi pas de regroupement en 1.1
Simon_Weaver
4
ou 1.2 ou 2.0. Je renonce à
Simon_Weaver
4
il est annoncé pour 2.1
Yush0
Cela peut être trompeur, je pense qu'il est important de mettre à jour votre réponse et de mentionner explicitement que les versions EF antérieures à EF 7 prennent en charge le regroupement. Cette réponse qui est plus un commentaire qu'une réponse réelle à la question du PO est trompeuse lorsqu'elle est lue seule (et est interprétée comme une réponse au PO qui ne l'est pas). En lisant ceci, on pourrait avoir la fausse impression comme si même EF 7 ne prend pas en charge le regroupement et évidemment les versions antérieures ne le prennent pas en charge, ce qui n'est tout simplement pas vrai.
BornToCode
14

Une extension utile est de collecter les résultats dans une Dictionaryrecherche rapide (par exemple dans une boucle):

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

À l'origine trouvé ici: http://www.snippetsource.net/Snippet/140/groupby-and-count-with-ef-in-c

Christian Moser
la source
1

Voici un exemple simple de group by dans .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()};

Ce qui se traduit par:

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

avec EF 6.2 cela a fonctionné pour moi

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