【发布时间】:2022-01-01 12:10:03
【问题描述】:
在我的移动应用程序中,我尝试从我的 SQL Server 数据库的表中检索数据。我正在使用 EF,并尝试使用分页来获得更好的性能。我需要从表的最后一个元素中检索数据。所以如果表有 20 行,我需要,对于第 0 页,ID 为 20、19、18、17、16,然后对于第 1 页,ID 为 15、14、13、12、11 等等......
问题是这样的:如果用户“A”正在从表中下载数据,用户“B”添加行怎么办?如果用户“A”获得第 0 页(即 ID 20、19、18、17、16),并且用户“B”在同一时刻添加行(即 ID 21),则使用经典查询,用户“A”为第 1 页将获得 ID 16, 15, 14, 13, 12... 所以另一次 ID 16
我的代码很简单:
int RecordsForPagination = 5;
var list = _context.NameTable
.Where(my_condition)
.OrderByDescending(my_condition_for ordering)
.Skip (RecordsForPagination * Page)
.Take (RecordsForPagination)
.ToList();
当然Page 是来自前端的int。
我该如何解决这个问题?
我找到了一个解决方案,但我不知道它是否完美。我可以使用
.SkipWhile(x => x.ID >= LastID)
改为
.Skip (RecordsForPagination * Page)
当然LastID 总是从前端发送。
你认为这段代码的性能总是很好吗?有没有更好的解决方案?
【问题讨论】:
-
分页是解决用户可能查询的数据多于一次合理显示的问题的解决方案。正确排序数据后,预计用户将主要查看第 1 页。(俗话说,“隐藏尸体的最佳位置是 Google 搜索结果的第 2 页。”)如果你真的必须将结果显示为“时间点”,然后确保使用行记录 CreatedAt 并使用
.Where(x => x.CreatedAt <= firstRunAt)捕获初始搜索,其中 firstRunAt 在搜索开始时捕获。但这确实是寻找问题的解决方案。
标签: sql-server entity-framework linq