Nombre de cadres SQL à Entity Group-By

Je dois traduire cette instruction SQL en une requête Linq-Entity...

SELECT name, count(name) FROM people
GROUP by name
61
demandé sur Aducci 2012-07-19 19:37:07

4 réponses

Syntaxe de 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() });
134
répondu Aducci 2012-07-19 15:43:31

Edit: EF Core 2.1 prend enfin en charge GroupBy

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


Entity Framework 7 (maintenant renommé Entity Framework Core 1.0 / 2.0) ne prend pas encore en charge GroupBy() pour la traduction en GROUP BY dans SQL généré (même dans la version finale 1.0, il ne le sera pas). Tout groupement la logique s'exécutera du côté client, ce qui pourrait entraîner le chargement de beaucoup de données.

Finalement, le code écrit comme ceci commencera automagiquement à utiliser GROUP BY, mais pour l'instant, vous devez être très prudent si le chargement de l'ensemble de vos données non groupées en mémoire entraînera 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é-que vous devriez probablement faire de toute façon.

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

19
répondu Simon_Weaver 2018-05-18 17:49:42

Une extension utile est de rassembler les résultats dans un Dictionary pour la 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

11
répondu Christian Moser 2014-07-15 16:06:51

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() });
0
répondu Nava Bogatee 2018-04-27 05:19:59