此查询查看其前面的记录并减去时间以计算总时间量。但是,当评估第一个记录时,它会在减法后的第三行引发错误。索引超出范围。当我删除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();
还有什么我想念的吗?
答案 0 :(得分: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);