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<IGrouping<TKey, TSource>>
类型的可枚举。 IGrouping
接口只有一个属性可以访问,Key
是您在GroupBy
表达式中指定的键,并实现了IEnumerable<T>
,因此您可以对结果进行其他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 表达式的主要内容,如果未能解决你的问题,请参考以下文章