SQL Server 2017 OFFSET+FETCH分页:如何判断已达最后一页
解决Razor C#分页中判断最后一页的问题
嘿,针对你遇到的分页判断最后一页、隐藏“下一页”按钮的问题,我来帮你拆解下两个方案的优劣,再给你具体的代码实现建议!
方案一:通过总记录数计算判断
这个方案逻辑最简单,核心就是用当前页号 × 每页条数,和总记录数对比:如果结果小于总记录数,说明还有下一页;反之就是最后一页。
优点
- 实现成本极低,只需要额外执行一次总记录数的查询
- 逻辑直观,容易维护
注意事项
- 如果你的表未来数据量会大幅增长(比如从几千条涨到几十万条),
Count()查询的性能可能会下降,但几千条的量级完全不用担心
代码示例
后台(Controller)
public IActionResult Index(int pageNumber = 1, int resultPerPage = 10) { // 先获取符合条件的总记录数(如果有过滤条件,要和后面的查询保持一致) int totalRecords = _dbContext.YourTableName.Count(); // 获取当前页的数据 var currentPageData = _dbContext.YourTableName .Skip((pageNumber - 1) * resultPerPage) .Take(resultPerPage) .ToList(); // 把分页相关参数传到视图 ViewBag.TotalRecords = totalRecords; ViewBag.CurrentPage = pageNumber; ViewBag.ResultPerPage = resultPerPage; return View(currentPageData); }
前端(Razor视图)
@* 只在有下一页时显示按钮 *@ @if (ViewBag.CurrentPage * ViewBag.ResultPerPage < ViewBag.TotalRecords) { <a asp-action="Index" asp-route-pageNumber="@(ViewBag.CurrentPage + 1)" asp-route-resultPerPage="@ViewBag.ResultPerPage"> 下一页 </a> }
方案二:预查询下一页是否存在
这个方案的思路是:查询当前页数据时,多取一条记录(比如每页要10条,就取11条),如果返回的记录数超过10条,说明还有下一页;如果刚好10条或更少,就是最后一页。或者也可以单独查询下一页的第一条数据是否存在,但多取一条的方式更高效。
优点
- 避免了大表
Count()的性能损耗,尤其适合数据量极大的场景 - 不需要单独维护总记录数的查询逻辑,和业务查询完全绑定(如果有过滤条件,自动继承)
代码示例
后台(Controller)
public IActionResult Index(int pageNumber = 1, int resultPerPage = 10) { // 多取1条记录,用于判断是否有下一页 int takeCount = resultPerPage + 1; var tempData = _dbContext.YourTableName .Skip((pageNumber - 1) * resultPerPage) .Take(takeCount) .ToList(); // 判断是否有下一页 bool hasNextPage = tempData.Count > resultPerPage; // 只保留当前页需要的10条数据 var currentPageData = tempData.Take(resultPerPage).ToList(); // 把判断结果传到视图 ViewBag.HasNextPage = hasNextPage; ViewBag.CurrentPage = pageNumber; ViewBag.ResultPerPage = resultPerPage; return View(currentPageData); }
前端(Razor视图)
@* 直接根据后台传来的判断结果显示按钮 *@ @if (ViewBag.HasNextPage) { <a asp-action="Index" asp-route-pageNumber="@(ViewBag.CurrentPage + 1)" asp-route-resultPerPage="@ViewBag.ResultPerPage"> 下一页 </a> }
方案选择建议
- 如果你当前表只有几千条记录,方案一完全够用,实现简单又直观
- 如果未来数据量会快速增长,或者你的查询带有复杂的过滤条件(
Count()会更慢),方案二更适合,性能更优
另外要注意:不管用哪个方案,都要保证分页参数的合法性(比如pageNumber不能小于1,resultPerPage要设置合理的最大值),还有如果有查询过滤条件,总记录数查询或者多取记录的查询都要带上相同的条件,不然判断会出错哦!
内容的提问来源于stack exchange,提问作者Bruno Teixeira
相关产品推荐
相关产品推荐

