该查询查看它之前的记录并减去时间以计算总时间。但是,当计算第一个记录时,它会在减法之后的第三行抛出错误。索引越界。当我删除Sum()时,错误就消失了,但我需要有效地求和。
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();
我还缺什么吗?
您上面的查询的问题是,当您到达具有最小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);