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

Dav*_*ave 5 c# linq performance 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();
Run Code Online (Sandbox Code Playgroud)

鉴于上面的代码,我在列表中查询了大约1000个设备.第三个声明很慢.如果已经加载到内存中,它不应该快吗?我理解在大多数情况下你会将整个查询应用于数据库调用,但在我的情况下,我已经将我的设备加载到内存中.第一和第二个电话非常快.

Sim*_*ead 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
Run Code Online (Sandbox Code Playgroud)

是一步一步的过程.首先,Where执行.这会遍历整个列表.然后OrderBy执行,你可以想象这是非常密集的.Skip然后迭代直到找到你想要的索引.Take然后在形成新列表之前迭代n个项目.

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