2011-04-17 102 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);