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