我在这些时间点有一个充满时间点和实验值的数据库表。我需要检索实验的值并创建一个缩略图,显示其数据的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点?
答案 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