You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:59:04