22

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

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

进入一个 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() });
}

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

提前致谢

4

2 回答 2

56

这里有两个问题:

  1. will的结果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() });
}

查询语法中的等效项是

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

在任何一种情况下,如果您希望第一个属性被命名StateId而不是Key,只需将其更改为

new { StateId = g.Key, Count = g.Count() }
于 2013-10-10T01:11:07.703 回答
3

这个不错

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

但是试试这个。

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() });
        }
于 2016-03-25T07:44:21.250 回答