如何使用LINQ to SQL对时间序列中的数据进行子采样?

时间:2010-04-09 16:21:51

标签: c# linq-to-sql

我在这些时间点有一个充满时间点和实验值的数据库表。我需要检索实验的值并创建一个缩略图,显示其数据的XY图。因为每个实验的实际数据集可能是100,000个数据点而我的图像只有100个像素宽,所以我想通过为图像取每个第n个时间点并忽略其余部分来对数据进行采样。

我当前的查询(无需采样即检索所有数据)非常简单:

var points = from p in db.DataPoints
             where p.ExperimentId == myExperimentId
             orderby p.Time
             select new {
                            X = p.Time,
                            Y = p.Value
                        }

那么,我怎样才能最好地从LINQ to SQL查询中的结果集中获取每个n点?

3 个答案:

答案 0 :(得分:4)

这将执行每个第n个元素:

int nth = 100;
var points = db.DataPoints
           .Where(p => p.ExperimentId == myExperimentId)
           .OrderBy(p => p.Time)
           .Where( (p, index) => index % nth == 0 )
           .Select( p => new { X = p.Time, Y = p.Value } );

它的工作原理是使用Queryable.Where重载,它在序列中提供索引,因此您可以根据索引进行过滤。

答案 1 :(得分:1)

.Skip(n).Take(1)

将返回一个样本点。反复调用以获得更多积分。

http://msdn.microsoft.com/en-us/library/bb386988.aspx

如果性能成为一个问题,并且您有一个包含连续值的int类型的主标识键,您可以尝试返回所有记录,这些记录将使主键平均分配n。

.Where(x => x.PK % n == 0)

答案 2 :(得分:-1)

你应该

.Skip(n).Take(100)

它会跳过你希望它跳过的每条记录的数量,并记录100条记录。

HTH