我有一个实体框架查询,可以返回约 10,000 行。这用于用图钉填充地图。
有没有一种方法可以将结果分块返回,速度与一次读取所有内容一样快?例如,如果我这样做:
.OrderBy(e => e.Id).Skip(offset).Take(1024)
一次读取 1K 的结果,总共与一次读取所有内容的时间大约相同吗?或者还有其他方法可以做到这一点吗?
注意,这不是分页网格的情况,我可以对
.Skip(x).Take(pageSize)
进行一次调用,并且一次调用就足够了,直到它们转到另一页。在这种情况下,我确实需要所有结果。
对性能和资源使用影响最大的情况是确保您使用投影 (
Select()
) 仅检索所需的值,或者如果您确实需要加载实体,则使用 AsNoTracking()
查询。这些都确保 EF 不会费心读取或添加到跟踪缓存。
如果您需要所有 10k 项,那么一次加载 10k 行 ID、坐标,也许还有一个名称/标签来填充地图区域应该不成问题。对结果进行分页更多的是一次只需要显示一页值。如果您需要 10k 个项目,一次加载 1k 个项目不会节省资源或时间。更新 10k 项(如果无法批量操作)可以通过一次仅加载/跟踪一个子集来节省资源,只要您清除页面之间的跟踪缓存即可。