2011-06-28 101 views
2

基本问题是确定现场传感器在报告的数据中存在差异。所有数据都被收集并转换成数据库中的表格。如何查找给定时间范围内的所有数据

所有记录都有一个DateSampleTaken字段,一旦记录按此字段排序,我想知道每个记录之间的间隔(例如)超过15分钟的情况。一旦识别出缺口,就会创建一个包含信息的对象。

我当然可以通过迭代来做到这一点,我只是想知道是否有Linq调用可以做到这一点。

+0

“记录之间”是什么意思?它是previousRecord - curRecord吗? – Mrchief

回答

6

这里是一个LINQ表达式来获取有十五分钟的一个样本a缺口样本序列:

var gaps = samples.Zip(samples.Skip(1), 
    (s0, s1) => 
     new 
     { 
      Sample = s0, 
      Delta = s1.DateSample - s0.DateSample, 
     }) 
    .Where(result => result.Delta.TotalMinutes >= 15) 
    .Select(result => result.Sample); 
+0

邮编!我总是忘记/迷惑那一个。 –

+0

完美!优秀的回答瑞克。我也经常忘记Zip。 – KevDog

1

假设列表已经排序。

var q = list.Select ((value, index) => new {value, index}); 
var valuesWithGaps = 
      from a in q 
      join b in q on a.index + 1 equals b.index 
      where (b.value.Date - a.value.Date).TotalMinutes > 15 
      select new {a, b}; /* There is a gap greater than 15 min 
           * between items a and b 
           */ 
0

This question显示了如何得到一个单一的差距,但我想不出如何让差距的列表没有某种形式的环...

Here is an article在那里你可以得到一个通用的方法,这样做,但它使用循环。

对不起,我不能给你一个很酷的LINQ查询来做到这一点,但至少有其他人绊倒这个问题可能会在上述链接中得到一些答案。

0

我认为您可以使用Select((e, idx) => new { Date = e.DateSampleTaken, Idx = idx})“索引”重载从您的排序列表中获取(日期,idx)对列表。如果你有,你可以用“自己”以idx2 = idx1 + 1的方式交叉加入,并选择日期的差异。我发现这很适合LINQ 2对象。不过,我怀疑任何O/RM框架都可以将这些技巧转化为SQL。通常,LINQ的表达能力远远高于任何O/RM可以转换为SQL的表达能力,但通常这只有在您尝试时才会显现出来。另一方面,如果你的数据库服务器允许在SQL中选择行索引,那么你可以用SQL解决这个问题。

0

你也许可以创建一个自定义的枚举器来迭代任何序列并使用谓词来比较任何对象和下一个对象?

1

我的看法:还没有,虽然测试:

 int i = 0; 
     var res = from s1 in _data 
        orderby s1.DateSampleTaken 
        select new { row_num = i++, DateSampleTaken = s1.DateSampleTaken }; 
     var res2 = from s1 in res 
        join s2 in res on s1.row_num equals s2.row_num + 1 
        where (s2.DateSampleTaken - s1.DateSampleTaken) > 15 
        select s1.DateSampleTaken; 
相关问题