如何使用LINQ从上下文中获取具有公共属性的对象数

时间:2016-05-26 03:18:00

标签: c# .net entity-framework linq

我想根据使用Group的上下文中的对象属性IdLINQ来获取给定时间内对象的数量/数量。 因此,结果应该给我一个列表(降序或升序),列出基于事件的对象(警报),以便我可以看到在一个时间范围内警报发生的频率。到目前为止我只有以下内容:

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的对象。

有没有办法完成这项工作?

1 个答案:

答案 0 :(得分:2)

一种方法是按GroupId的组合分组,而不仅仅是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);