web-dev-qa-db-fra.com

SQL à Entity Framework Compter Group-By

J'ai besoin de traduire cette instruction SQL en une requête Linq-Entity ...

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

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

Edit: EF Core 2.1 supporte enfin GroupBy

Mais cherchez toujours des 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 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 GroupBy() pour la traduction en GROUP BY dans le code SQL généré (même dans la version 1.0 finale, il ne le fera pas). Toute logique de regroupement s'exécutera côté client, ce qui pourrait entraîner le chargement de nombreuses données. 

Finalement, le code écrit comme ceci commencera automatiquement avec GROUP BY, mais pour le moment, vous devez être très prudent si le chargement de la totalité de votre jeu de données non groupé dans la mémoire risque de provoquer des problèmes de performances.

Pour les scénarios où il s'agit d'un briseur de transaction, vous devrez écrire le code 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

19
Simon_Weaver

Une extension utile consiste à collecter les résultats dans une Dictionary pour une recherche rapide (par exemple, en 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
Christian Moser

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
Nava Bogatee

Voici un exemple simple de groupe par 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]
0
Greg Gum