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,我真的很希望能够在 1 个 LINQ 语句中做到这一点。我需要做什么才能实现这一目标?

4

2 回答 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
                    });
于 2013-03-04T22:40:06.553 回答
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() });

使用一点技巧来添加每次访问的所有开始日期和结束日期并获得差异。

于 2013-03-04T22:53:05.513 回答