124 votes

SQL à Entity Framework Compter Groupe-By

J'ai besoin de traduire ceci SQL à un Linq-Entity une requête...

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

228voto

Aducci Points 10573

Syntaxe des requêtes

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

25voto

Simon_Weaver Points 31141

Edit : EF Core 2.1 supporte enfin GroupBy

Mais regardez toujours dans la console / le journal pour les messages. 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 (maintenant renommé en Entity Framework Core 1.0 / 2.0 ) ne prend pas encore en charge GroupBy() pour la traduction en GROUP BY dans le SQL généré (même dans la version finale 1.0, ce ne sera pas le cas). Toute logique de regroupement sera exécutée du côté client, ce qui pourrait entraîner le chargement d'un grand nombre de données.

Un jour, le code écrit de cette façon commencera automatiquement à utiliser GROUP BY, mais pour l'instant, vous devez être très prudent si le chargement en mémoire de l'ensemble de vos données non groupées entraîne des problèmes de performance.

Pour les scénarios où cela constitue un obstacle, 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

18voto

Christian Moser Points 204

Une extension utile consiste à rassembler les résultats dans un fichier Dictionary pour une recherche 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);

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

10voto

Greg Gum Points 1441

Voici des exemples simples de regroupement 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()};

Les deux se traduisent par :

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

2voto

Nava Bogatee Points 186

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X