使用LINQ处理大型SQL查询

本文关键字:SQL 查询 大型 处理 LINQ 使用 | 更新日期: 2023-09-27 18:02:34

我试图通过实体数据模型从MS SQL数据库中的表中获取每条记录,其中约有2000万个条目。我最初的想法是按块检索数据,如下所示:

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查询的最佳方法是什么?

使用LINQ处理大型SQL查询

发生错误是因为Skip方法需要在OrderBy之后运行。没有order,就不能运行Skip。Skip方法需要知道要取的第一个数字,如果你输入第一个需要知道选择的顺序来知道第一个是从开始到结束还是从结束到开始。

你可以在这里阅读更多

所以,你的代码看起来像这样:
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.OrderByDescending(y => y).Skip(i).Take(chunkSize);
        }
    }
}
如果你认为这是一个沉重的查询,记住实体框架可以做一个查询和数据的缓存。如果您不喜欢该方法的sql,您可以手动运行查询。

个人经历:我将其与数据库一起使用,其中包含2 bi行和…它并不慢。但我有索引在我的表,我总是使用缓存。

更多:

如果你愿意,你可以使用程序。点击这里查看更多信息

您可能不需要执行OrderBy—您可能只需要在执行SkipTake之前填充列表。我认为您可以使用.Count()来填充查询,之后您可以使用SkipTake