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
Il y a deux problèmes ici:
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.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() }
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() });
}