Group by,Count和Lambda Expression

时间:2013-10-10 01:09:41

标签: c# linq entity-framework lambda

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

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小时后迷路了。你能帮我吗?

提前致谢

2 个答案:

答案 0 :(得分:45)

这里有两个问题:

  1. GroupBy的结果将是IEnumerable<IGrouping<TKey, TSource>>类型的可枚举。 IGrouping接口只有一个您可以访问的属性,Key这是您在GroupBy表达式中指定的密钥,并实现IEnumerable<T>,因此您可以执行其他Linq操作结果。
  2. 如果无法从属性或字段表达式推断,则需要为匿名类型指定属性名称。在这种情况下,您在Count上调用IGrouping,因此您需要为该属性指定名称。
  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 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() }
    

答案 1 :(得分:3)

这个很好

mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT_64;

但试试这个。

sudo ln /usr/lib64/atlas/libcblas.so.3.0 /usr/lib64/libcblas.so
sudo ln -s /usr/lib64/atlas/libatlas.so.3.0 /usr/lib64/libatlas.so