Group by,Count和Lambda Expression

N8K*_*8K8 20 c# linq lambda entity-framework

我正在尝试翻译以下查询:

SELECT STATE, COUNT(*)
FROM MYTABLE
GROUP BY STATE;
Run Code Online (Sandbox Code Playgroud)

进入lambda表达式.我正在使用C#和EntityFramework,但似乎我无法使其工作.到目前为止,这是我在我的存储库中的内容:

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() });
}
Run Code Online (Sandbox Code Playgroud)

当然它没有编译,我在谷歌搜索2小时后迷路了.请你帮助我好吗?

提前致谢

p.s*_*w.g 49

这里有两个问题:

  1. GroupBy遗嘱的结果将是一个可枚举的类型IEnumerable<IGrouping<TKey, TSource>>.该IGrouping接口只有一个您可以访问的属性,Key这是您在GroupBy表达式中指定的键,并且实现,IEnumerable<T>因此您可以对结果执行其他Linq操作.
  2. 如果无法从属性或字段表达式推断出匿名类型,则需要为匿名类型指定属性名称.在这种情况下,你调用CountIGrouping,所以你需要为属性指定名称.

试试这个:

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() });
}
Run Code Online (Sandbox Code Playgroud)

查询语法中的等价物将是

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() };
}
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,如果您想要命名第一个属性StateId而不是,请将其Key更改为

new { StateId = g.Key, Count = g.Count() }
Run Code Online (Sandbox Code Playgroud)