使用LINQ获取每第n行

我们在SQL数据库中有一个表,其中包含我需要创建图表的历史原始数据。 我们通过Entity Framework和LINQ访问数据库。

对于较小的日期时间间隔,我可以简单地读取数据并生成图表:

var mydata = entity.DataLogSet.Where(dt => dt.DateTime > dateLimit); 

但我们想要实现一个function,您可以从图表中快速“缩小”以包括更大的日期间隔(过去5天,上个月,过去6个月,过去10年等等)。

我们不希望为此绘制每个数据点的图表。 我们想要使用数据样本,我的意思是这样的 –

  • 最近5天 :绘制表格中的每个数据点
  • 上个月 :绘制表格中每10个数据点的图表
  • 过去6个月 :绘制每100个数据点的图表

数据点和图表名称的数量仅是示例。 我需要的是一种从数据库中只选择“第n”行的方法。

您可以使用包含枚举项索引的Select重载。 像这样的东西应该做的伎俩 –

 var data = myDataLogEnumeration. Select((dt,i) => new { DataLog = dt, Index = i }). Where(x => x.Index % nth == 0). Select(x => x.DataLog); 

如果您需要使用WhereBy限制查询或使用OrderBy排序,则必须第一次选择 之前执行此操作,否则索引将全部错误 –

 var data = myDataLogEnumeration. Where(dt => dt.DateTime > dateLimit). OrderBy(dt => dt.SomeField). Select((dt,i) => new { DataLog = dt, Index = i }). Where(x => x.Index % nth == 0). Select(x => x.DataLog); 

不幸的是,正如juharr评论的那样,Entity Framework中不支持这种重载。 解决这个问题的一种方法是做这样的事情 –

 var data = entity.DataLogSet. Where(dt => dt.DateTime > dateLimit). OrderBy(dt => dt.SomeField). ToArray(). Select((dt,i) => new { DataLog = dt, Index = i }). Where(x => x.Index % nth == 0). Select(x => x.DataLog); 

请注意添加ToArray() 。 这并不理想,因为它会仅选择每第n行之前强制加载与初始查询匹配的所有数据。