c# - 为什么分页的 LINQ IQueryable 性能如此差?

标签 c# performance linq iqueryable

List<Device> deviceList = GetDevices(); // these are loaded in memory already as a list

IQueryable<Device> IDevices = deviceList.AsQueryable<Device>();

deviceList = IDevices.Where(i => i.StatusID == 2).OrderBy(j => j.LastCommunicated).Skip(recordsToSkip).Take(pageSize).ToList();

鉴于上面的代码,我在列表中有大约 1000 台设备被查询。第三条语句非常慢。如果它已经加载到内存中,它不应该很快吗?我知道在大多数情况下,您会将整个查询应用于数据库调用,但就我而言,我已经将我的设备加载到内存中。第 1 次和第 2 次通话非常快。

最佳答案

IQueryable 在这一点上是无关紧要的。您看到的性能问题是每个链返回一个新的迭代器。

所以,这个:

IDevices
    .Where(i => i.StatusID == 2) // iterates over 1000 items
    .OrderBy(j => j.LastCommunicated) // orders however many items have a StatusID of 2
    .Skip(recordsToSkip) // iterates "recordsToSkip" number of times
    .Take(pageSize) // iterates "pageSize" times

是一个循序渐进的过程。首先,Where 执行。这遍历整个列表。然后 OrderBy 执行,您可以想象这是相当密集的。 Skip 然后遍历直到找到您想要的索引。 Take 然后在形成新列表之前迭代 n 个项目。

话虽这么说.. 如果您直接对数据库运行此查询,它会快得多。

关于c# - 为什么分页的 LINQ IQueryable 性能如此差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085728/

相关文章:

javascript - 如何减少服务器 "Wait"时间?

c# - 时间序列的"Join"

c# - 通过导航属性加入的 Lambda 语法?

c# - 以大写形式显示句子中的最后一个单词

C#无法在具有测试属性的条件下获取数据

wcf - WCF 场景中的自签名证书性能

c# - DateTime.ToString 删除斜线

javascript - Google 跟踪代码管理器 - 页脚中的脚本怎么样?

c# - 我该怎么做才能加快连接到我的 SQL 在线数据库(("pairing"速度,而不是查询速度)?

c# - 模型 View 演示器框架 : In which project should the interfaces live?