【发布时间】:2013-03-06 23:45:22
【问题描述】:
我正在尝试通过实体数据模型从包含大约 2000 万个条目的 MS SQL 数据库中的表中获取每条记录。我最初的想法是按块检索数据,如下所示:
public IEnumerable<IEnumerable<device>> GetDevicesInChunks(int chunkSize)
{
using (var db = new AccountsEntities())
{
for (int i = 0; i < db.devices.Count(); i += chunkSize)
{
yield return db.devices.Skip(i).Take(chunkSize);
}
}
}
但是,从我使用上述方法时抛出的异常来看,我似乎必须在调用Skip 之前调用OrderBy
The method 'Skip' is only supported for sorted input in LINQ to Entities. The method
'OrderBy' must be called before the method 'Skip'.
我确信在我检索到的每个记录子集上调用 OrderBy 会很昂贵,因为这些设备没有特定的顺序 - 我觉得我在这里走错了路。
通过 LINQ 处理大型 SQL 查询的最佳方法是什么?
【问题讨论】:
-
您不能使用
Where并通过主键而不是Skip进行过滤吗?或者只是OrderBy主键? -
有什么特别的原因为什么你必须分块做这个吗?
-
@Tory 我认为一次加载 2000 万个实体就足够了..
-
是什么样的数据?为什么需要全部加载?
-
OrderBy聚集索引,如果表上存在;如果没有,OrderBy主键...如果您必须 OrderBy。似乎很奇怪,它是必需的。
标签: c# .net sql-server linq entity-framework