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/