Group by、Count 和 Lambda 表达式

Posted

技术标签:

【中文标题】Group by、Count 和 Lambda 表达式【英文标题】:Group by, Count and Lambda Expression 【发布时间】:2013-10-17 14:29:27 【问题描述】:

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

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

提前致谢

【问题讨论】:

你能提供你得到的编译器错误吗? 【参考方案1】:

这里有两个问题:

    GroupBy 的结果将是IEnumerable&lt;IGrouping&lt;TKey, TSource&gt;&gt; 类型的可枚举。 IGrouping 接口只有一个属性可以访问,Key 是您在GroupBy 表达式中指定的键,并实现了IEnumerable&lt;T&gt;,因此您可以对结果进行其他Linq 操作。 如果无法从属性或字段表达式推断匿名类型,则需要为它指定属性名称。在这种情况下,您在 IGrouping 上调用 Count,因此您需要为该属性指定一个名称。

试试这个:

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

【讨论】:

谢谢!所以它将是 g.Key.Field (在我的情况下,状态) 。对吗? @user2865100 对于您是要按State 还是StateId 分组,我有点困惑。他们应该是同一个领域(只是一个错字)?如果不是,它们之间的关系如何? 我实际上从我的原始代码中掩盖了一点,所以很可能是一个错字。对于那个很抱歉。状态是一个描述,我需要获取所有匹配 Where 子句的每个描述的计数。我需要这个才能使用这个来“喂”一个饼图:blog.platformular.com/2012/03/20/…。此代码在我的存储库中,现在可以在您的帮助下编译。谢谢!我现在卡在控制器上,但现在我已经解决了这个问题,我需要看看它。 @user2865100 好吧,很高兴我能帮上忙。快乐编码:)【参考方案2】:

这个不错

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

【讨论】:

以上是关于Group by、Count 和 Lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

lambda group by 的用法

关于SQL中两张表联合sum和group by的查询问题

SQL GROUP BY/COUNT 即使没有结果

MySQL:优化 COUNT(*) 和 GROUP BY

带有 LEFT JOIN 和 GROUP BY 的 COUNT(*) 在 MySQL 中包含 NULL

使用 group by、inner query 和 count 优化查询