为什么这种LINQ IQueryable Performance for Pagination如此差劲?

时间:2013-11-20 01:35:26

标签: 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 个答案:

答案 0 :(得分:6)

那时

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 项目。

那就是说..如果您直接针对数据库运行此查询,它会更快。