c# – 计算不同行中不同列之间的差异

我有一张桌子记录了访问期间车辆发生的情况.对于每次访问,都有多行来表示已完成的操作.表格看起来像这样
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,我真的希望能够在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
                    });

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...