linq分组与最近的记录

时间:2014-01-02 10:07:02

标签: c# linq grouping

I have an sql table with data like this

这是我的历史记录表,用于跟踪每个PERSON在给定时间内的状态。 我想以这样的方式对其进行分组,即按Update_date对其进行分组。并获得status_id的COUNT。此外,如果某个人在组内有多个状态更改,请执行最近的状态更改。 (请参阅id = 5的行,应该忽略该行,因为同一个人有更近期的状态更改)

enter image description here

我一直在尝试使用不同的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;

这给了一些接近的东西,但问题是它没有照顾每个人的最新状态更新。任何帮助表示赞赏。

2 个答案:

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