C# 使用LINQ每N行获取一次

C# 使用LINQ每N行获取一次,c#,entity-framework,linq,C#,Entity Framework,Linq,我们的SQL数据库中有一个表,其中包含我创建图表所需的历史原始数据。我们通过实体框架和LINQ访问数据库 对于较小的日期时间间隔,我可以简单地读取数据并生成图表: var mydata = entity.DataLogSet.Where(dt => dt.DateTime > dateLimit); 但我们希望实现一个功能,您可以从图表中快速“缩小”以包括更大的日期间隔(过去5天、上个月、过去6个月、过去10年等等) 我们不想为此绘制每个数据点的图表。我们想用一个数据样本,我的意思

我们的SQL数据库中有一个表,其中包含我创建图表所需的历史原始数据。我们通过实体框架和LINQ访问数据库

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

var mydata = entity.DataLogSet.Where(dt => dt.DateTime > dateLimit);
但我们希望实现一个功能,您可以从图表中快速“缩小”以包括更大的日期间隔(过去5天、上个月、过去6个月、过去10年等等)

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

  • 过去5天:绘制表格中每个数据点的图表
  • 上个月:表格中每10个数据点绘制一张图表
  • 过去6个月:每100个数据点绘制一张图表
数据点的数量和图表名称只是示例。我需要的是一种只从数据库中选取“n”行的方法。

您可以使用包含枚举项索引的重载。像这样的东西应该能奏效--

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

不幸的是,正如所评论的,实体框架中不支持这种重载。解决这个问题的一种方法是做这样的事情--


注意添加了一个
ToArray()
。这并不理想,因为它将强制加载与初始查询匹配的所有数据,然后只选择第n行。

但这将获取每一行,不是吗?数一数指数,我的意思是,不知道你的意思。不,它不会获取每一行。在访问索引之前,需要使用
Where
限制查询。不过,它只会每N行返回一次。我会尝试一下。非常感谢。我不相信EF支持这种过载。使用ToEnumerable()代替ToArray()。这样,ToEnumerable()上面的逻辑将作为SQL在服务器上执行,而ToEnumerable()下面的逻辑将在内存中执行(Linq to Objects)。由于EntityFramework现在在默认情况下对结果进行流式处理,所以在采样之前不必具体化内存中的所有数据+
var data = myDataLogEnumeration.
        Select((dt,i) => new { DataLog = dt, Index = i }).
        Where(x => x.Index % nth == 0).
        Select(x => x.DataLog);
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);
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);