Linq - 查询与之前的记录比较

时间:2011-04-17 01:25:35

标签: c# linq

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

还有什么我想念的吗?

1 个答案:

答案 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);