我们的SQL数据库中有一个表,其中包含我需要创建图表的历史原始数据。我们通过Entity Framework和LINQ访问数据库。
对于较小的日期时间间隔,我可以简单地读取数据并生成图表:
var mydata = entity.DataLogSet.Where(dt => dt.DateTime > dateLimit);
但是我们希望实现一个功能,您可以从图表中快速“缩小”以包含更大的日期间隔(过去5天,上个月,过去6个月,过去10年等等)。< / p>
我们不希望为此绘制每个数据点的图表。我们想要使用数据样本,我的意思是这样的 -
数据点和图表名称的数量仅是示例。我需要的是一种从数据库中只选择“第n”行的方法。
答案 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行之前强制加载与初始查询匹配的所有数据。