web-dev-qa-db-fra.com

Grouper par, compter et expression lambda

J'essaie de traduire la requête suivante:

SELECT STATE, COUNT(*)
FROM MYTABLE
GROUP BY STATE;

Dans une expression lambda. J'utilise C # et EntityFramework, mais il ne semble pas que je puisse le faire fonctionner. Voici ce que j'ai sur mon dépôt jusqu'à présent:

public IEnumerable<object> PorcentajeState(Guid id)
{
    return _context.Sates.Where(a => a.Id == id)
                         .GroupBy(a => a.State)
                         .Select(n => new { n.StateId , n.Count() });
}

Bien sûr, il ne compile pas et je suis perdu après avoir googlé pendant 2 heures. Pourriez-vous m'aider s'il vous plait?

merci d'avance

20
N8K8

Il y a deux problèmes ici:

  1. Le résultat de GroupBy sera un énumérable de type IEnumerable<IGrouping<TKey, TSource>>. L'interface IGrouping n'a qu'une seule propriété à laquelle vous pouvez accéder, Key qui est la clé que vous avez spécifiée dans l'expression GroupBy, et implémente IEnumerable<T> pour que vous puissiez effectuer d'autres opérations Linq sur le résultat.
  2. Vous devez spécifier un nom de propriété pour le type anonyme s'il ne peut pas être déduit d'une propriété ou d'une expression de champ. Dans ce cas, vous appelez Count sur le IGrouping, vous devez donc spécifier un nom pour cette propriété.

Essaye ça:

public IEnumerable<object> PorcentajeState(Guid id)
{
    return _context.Sates.Where(a => a.Id == id)
                         .GroupBy(a => a.StateId)
                         .Select(g => new { g.Key, Count = g.Count() });
}

L'équivalent dans la syntaxe de requête serait

public IEnumerable<object> PorcentajeState(Guid id)
{
    return from a in _context.Sates
           where a.Id == id
           group a by a.StateId into g
           select new { a.Key, Count = g.Count() };
}

Dans les deux cas, si vous souhaitez que la première propriété soit nommée StateId au lieu de Key, remplacez-la par

new { StateId = g.Key, Count = g.Count() }
48
p.s.w.g

Celui-ci est bien

public IEnumerable<object> PorcentajeState(Guid id)
    {
        return _context.Sates.Where(a => a.Id == id)
                             .GroupBy(a => a.StateId)
                             .Select(g => new { g.Key, Count = g.Count() });
    }

Mais essayez ceci.

public IEnumerable<object> PorcentajeState(Guid id)
        {
            return _context.Sates.Where(a => a.Id == id)
                                 .GroupBy(a => a.StateId)
                                 .Select(g => new { g.Key.StateId, Count = g.Count() });
        }
3
Ahsan Qureshi