2011-04-17 133 views
1

该查询查看之前的记录,并减去计算总时间的时间。但是,当第一条记录被评估时,它会在减法后的第三行发出错误。索引超出界限。当我删除Sum()时,错误消失,但我需要高效的总和。Linq - 查询前的记录比较

var allRecorded = queryable.Where(x => x.DataId== Id); 
var dataFiltered = allRecorded.Where(x => x.DataValue >= lowerThreshold && x.DataValue < upperThreshold); 
var sumOfExactTimes = dataFiltered.Select(times => (times.EndTime - allRecorded.Where(time2 => time2.EndTime < times.EndTime).Select(x => (DateTime?) x.EndTime).Max()).GetValueOrDefault().TotalMinutes).Sum(); 

还有什么我失踪了吗?

回答

2

与上面的查询有关的问题是,当您到达具有最小EndTime的项目时,找不到任何结果为空。然后尝试最大限度地收集导致错误的空集合。

但是,这个查询可以被大大简化。先分类然后聚合以找出差异会更容易。

var data = queryable 
    .Where(item => item.DataId == id 
       && item.DataValue >= lowerThreshold 
       && item.DataValue < upperThreshold) 
    .OrderBy(item => item.EndTime) 
    .ToList(); 
var sumOfExactTimes = data.Skip(1) 
    .Aggregate(
     Tuple.Create(data.First(), 0.0), // [1] Prev Item [2] Result 
     (seed, item) => 
      Tuple.Create(
       item, 
       seed.Item2 + (item.EndTime - seed.Item1.EndTime).TotalMinutes), 
     result => result.Item2);