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

本文关键字:记录 比较 查询 Linq | 更新日期: 2023-09-27 17:50:27

该查询查看它之前的记录并减去时间以计算总时间。但是,当计算第一个记录时,它会在减法之后的第三行抛出错误。索引越界。当我删除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();

我还缺什么吗?

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

您上面的查询的问题是,当您到达具有最小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);