计算不同行中不同列之间的差异
我有一张桌子,记录访问期间车辆发生的情况。 对于每次访问,都有多行来表示已完成的操作。 桌子看起来像这样
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语句中做到这一点。 我需要做些什么才能做到这一点?
我认为这应该工作...
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
});
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() });
使用一些小技巧为每次访问添加所有开始日期和结束日期,并获得差异。
链接地址: http://www.djcxy.com/p/69769.html上一篇: Calculating difference between different columns in different rows