使用LINQ获取每第n行

时间:2017-05-12 17:27:12

标签: c# entity-framework linq

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

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

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

但是我们希望实现一个功能,您可以从图表中快速“缩小”以包含更大的日期间隔(过去5天,上个月,过去6个月,过去10年等等)。< / p>

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

  • 过去5天:绘制表格中的每个数据点
  • 上个月:绘制表格中的每第10个数据点
  • 过去6个月:计划每100个数据点

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

1 个答案:

答案 0 :(得分:2)

您可以使用包含枚举项目索引的Select重载。这样的事情可以解决问题 -

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

如果您需要使用 Where 限制查询或使用 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行之前强制加载与初始查询匹配的所有数据。