我想根据使用Group
的上下文中的对象属性Id
和LINQ
来获取给定时间内对象的数量/数量。
因此,结果应该给我一个列表(降序或升序),列出基于事件的对象(警报),以便我可以看到在一个时间范围内警报发生的频率。到目前为止我只有以下内容:
List<Alarm> alarmList = ctx.Alarm.Where(t => t.TimeStamp >= span)
.Where(s => s.Active)
.GroupBy(g => g.Group)
.OrderByDescending(c => c.Count())
.SelectMany(a => a).ToList();
它为我提供了按组排序的定义时间范围内的所有警报。 我无法弄清楚如何涉及属性Id 并计算具有相同组+ id的对象。
有没有办法完成这项工作?
答案 0 :(得分:2)
一种方法是按Group
和Id
的组合分组,而不仅仅是Group
,然后按顺序排序:
List<Alarm> alarmList = ctx.Alarm.Where(t => t.TimeStamp >= span)
.Where(s => s.Active)
.GroupBy(g => g.Group.ToString() + "_" + g.Id.ToString())
.OrderByDescending(c => c.Count())
.SelectMany(a => a).ToList();
或者,如果您不想使用string
作为组密钥(通常我会这样做),您可以创建一个匿名类型:
List<Alarm> alarmList = ctx.Alarm.Where(t => t.TimeStamp >= span)
.Where(s => s.Active)
.GroupBy(g => new { g.Group, g.Id })
.OrderByDescending(c => c.Count())
.SelectMany(a => a).ToList();
如果您想计算每Group + Id
个警报的数量,那么您应该将解决方案保留为IGrouping
格式一段时间:
var alarmGroup = ctx.Alarm.Where(t => t.TimeStamp >= span)
.Where(s => s.Active)
.GroupBy(g => new { g.Group, g.Id })
.OrderByDescending(c => c.Count());
当你需要你的项目时,你可以简单地显示每组的项目数量:
foreach (var grp in alarmGroup)
Console.WriteLine(grp.Count() + " " + grp.Key.Group + "+" + grp.Key.Id);