计算不同行的不同列之间的差异

7

我有一张记录车辆在访问期间发生情况的表格。对于每次访问,有多行记录表示已经完成的事项。表格如下:

VisitID | ActionID | StartTime | EndTime
   0    |    0     | 1/1/2013  | 1/2/2013
   1    |    0     | 1/2/2013  | 1/4/2013
   1    |    1     | 1/4/2013  | 1/7/2013
   2    |    0     | 1/4/2013  | 1/5/2013
   2    |    1     | 1/5/2013  | 1/6/2013
   2    |    2     | 1/6/2013  | 1/7/2013

我希望构建一个LINQ查询,能够获取访问所花费的时间。 TotalTime 是通过先找到第一个和最后一个(最低和最高)ActionID,然后计算 last.EndTime - first.StartTime 得出的。期望结果:

VisitID | TotalTime
   0    |   1
   1    |   5
   2    |   3

我可以通过以下方式生成我期望的结果

var first = db.Visits.Where(v => v.ActionID == 0)
var last = db.Visits.GroupBy(x => x.VisitID).Select(g => g.OrderByDescending(x => x.ActionID).First())

first.Join(last, f => f.VisitID, l => l.VisitID, (f, l) new{ VisitID = Key, TotalTime = l.EndTime - f.StartTime});

我真的不喜欢我用来获取最后一个ActionID的hack方法,我希望能够在一个LINQ语句中完成。我需要做什么才能实现这个目标?

2个回答

4

我认为这应该可以工作...


var result = db.Visits.GroupBy(v => v.VisitID)
            .Select(g => new
                    {
                        VisitId = g.Key,
                        TotalTime = g.Max(v => v.EndTime).Subtract(g.Min(v => v.StartTime)).Days
                    });

编辑:这假设 actionid 并不像最大和最小开始日期那样重要。以下是另一种解决方案,其中 actionid 被排序,并使用第一个和最后一个访问来计算时间差。

var result2 = db.Visits.GroupBy(v => v.VisitID)
            .Select(g => new
                    {
                        VisitId = g.Key,
                        TotalTime =
                    g.OrderBy(v => v.ActionID).Last().EndTime.Subtract(g.OrderBy(v => v.ActionID).First().StartTime).Days
                    });

1
@lazyberezovsky 很好的发现。我已经更新了答案以返回天数。但是,我不确定这个查询是否适用于Entity Framework,因为它看起来像是一个EF查询。 - Jace Rhea
1
当然可以!按VisitID分组并使用minmax。如果提供了对一个可能含糊不清的问题的两个答案,那就更好了。 - Jeff

0
db.Visits.GroupBy(v => v.VisitID)
    .Select(g => new { VisitId = g.Key, 
            Days = g.Select(x => x.EndTime.ToOADate()).Sum()
            -g.Select(x => x.StartTime.ToOADate()).Sum() });

使用了一点小技巧,为每次访问添加了所有开始日期和结束日期,并计算它们之间的差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接