这是我的历史记录表,用于跟踪每个PERSON在给定时间内的状态。 我想以这样的方式对其进行分组,即按Update_date对其进行分组。并获得status_id的COUNT。此外,如果某个人在组内有多个状态更改,请执行最近的状态更改。 (请参阅id = 5的行,应该忽略该行,因为同一个人有更近期的状态更改)
我一直在尝试使用不同的Linq嵌套语句,但却没有成功。
var aa = _DatabaseContext.VAHistories
.GroupBy(a => SqlFunctions.DatePart("dy", a.update_date))
.Select(g => new
{
Name = g.Key,
Status0= g.Where(c => c.status_id == 0).GroupBy(gg => gg.person_id).Select(c => c.Max(m => m.update_date)).Count(),
Status1= g.Where(c => c.status_id == 1).GroupBy(gg => gg.person_id).Select(c => c.Max(m => m.update_date)).Count(),
Status2= g.Where(c => c.status_id == 2).GroupBy(gg => gg.person_id).Select(c => c.Max(m => m.update_date)).Count(),
Status4= g.Where(c => c.status_id == 4).GroupBy(gg => gg.person_id).Select(c => c.Max(m => m.update_date)).Count(),
Status3= g.Where(c => c.status_id == 5).GroupBy(gg => gg.person_id).Select(c => c.Max(m => m.update_date)).Count()
}
).ToList<object>();
return aa;
这给了一些接近的东西,但问题是它没有照顾每个人的最新状态更新。任何帮助表示赞赏。
答案 0 :(得分:0)
您只需要与密钥中的日期匹配的记录。
var groupedData = (from h in _DatabaseContext.VAHistories
group h by new { h.Date } into g1
select new {
Name = g1.Key,
Status0 = g1.Count(hd => hd.Date == g1.Key && hd.Status_id = 0),
Status1 = g1.Count(hd => hd.Date == g1.Key && hd.Status_id = 1),
Status2 = g1.Count(hd => hd.Date == g1.Key && hd.Status_id = 2),
Status3 = g1.Count(hd => hd.Date == g1.Key && hd.Status_id = 3),
Status4 = g1.Count(hd => hd.Date == g1.Key && hd.Status_id = 4),
}).ToList();
return groupedData;
答案 1 :(得分:0)
看来你已经编写了必要的代码,但只是把它放在了错误的地方。您需要首先应用关于每个人最新更改的要求,然后继续进行日期分组等。
初始过滤可以通过以下代码完成:
GroupBy(gg => gg.person_id).Select(c => c.OrderByDescending(m => m.update_date).First())
应用于整套记录。
总而言之,尝试执行以下操作:
var aa = _DatabaseContext.VAHistories
.GroupBy(gg => gg.person_id).Select(c => c.OrderByDescending(m => m.update_date).First())
.GroupBy(a => SqlFunctions.DatePart("dy", a.update_date))
.Select(g => new
{
Name = g.Key,
Status0= g.Where(c => c.status_id == 0).Count(),
Status1= g.Where(c => c.status_id == 1).Count(),
Status2= g.Where(c => c.status_id == 2).Count(),
Status4= g.Where(c => c.status_id == 4).Count(),
Status3= g.Where(c => c.status_id == 5).Count()
})
.ToList<object>();