linq 如何按数据分组,并按日期时间选择每组的第一条记录,然后再按分组?

piah890a  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(161)

我有一张表,如下所示:

工作计划:

JobId     ProcessId      DepartmentId         Status         ProcessedTime    
1         100            10                   Done           2022-11-08 19:41
2         101            10                   Done           2022-11-09 19:41
3         100            10                   Failed         2022-11-09 19:41

我想对group by ProcessId and select top 1 Status by latestProcessedTimeorder by ProcessedTime desc)进行分组,然后再次按“Status“分组,以计算“Done“和“Failed“统计信息。

最终输出:

Done = 1
Failed = 1

将根据最新的2022-11-09 19:41考虑ProcessId = 100的“Fail“状态

代码:

var statistics = (from js in context.JobSchedular
                  where js.DepartmentId == 10
                  group by ProcessId //
                  select new StatisticsModel
                  {
                     Done = 1,
                     Failed = 1
                  }
                  ).FirstOrDefault();

我在这里有点困惑,按ProcessId分组,按最近的ProcessedTime选择前1个状态,然后按“状态”进一步分组以计算统计信息。
有人能帮帮忙吗?

8yparm6h

8yparm6h1#

如果我正确理解预期结果,它应该是以下查询:

var jobs = 
    from js in context.JobSchedular
    where js.DepartmentId == 10
    select js;

var staitsticQuery = 
    from js in jobs
    group js by js.ProcessId into g
    select new 
    {
        ProcessId = g.Key,
        Done = g.Sum(x => x.Status == "Done" ? 1 : 0),
        Failed = g.Sum(x => x.Status == "Failed" ? 1 : 0)
    };

var finalQuery = 
    from s in staitsticQuery
    from js in jobs
        .Where(js => js.ProcessId == s.ProcessId)
        .OrderByDescending(js => js.ProcessedTime)
        .Take(1)
    select new 
    {
        ProcessId = s.ProcessId,
        Done = s.Done,
        Failed = s.Failed,
        LastStatus = js.Status
    };

var statistics = finalQuery.ToList();

相关问题