我有一张表记录访问期间车辆发生的情况。对于每次访问,都有多行来表示已完成的操作。该表看起来像这样计算不同行中不同列之间的差异
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的黑客,我真的希望能够在1条LINQ语句中执行此操作。我需要做些什么才能做到这一点?
+1另外,我认为他想要总日数,而不是整个时间跨度 – 2013-03-04 22:48:54
@lazyberezovsky良好的捕获。我已更新答案以返回天数。但是,我不确定此查询是否可以与实体框架一起使用,因为这看起来像是一个EF查询。 – 2013-03-04 22:55:23
当然!通过VisitID分组并使用'min'&'max'。布朗尼指出,对于可能含糊不清的问题提供了答案 – Jeff 2013-03-04 23:14:56