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

如何编写LINQ查询筛选RowNumber介于两个变量之间的元素实现分页

问题说明

你现有代码存在几个明显问题:

  • 未对入参PageNumber、PageSize做空值和合法性校验,参数为null或者小于1时会触发计算异常
  • 直接在LINQ to Entities查询里用i++生成行号,EF无法将该逻辑翻译成SQL语句,运行会直接报错
  • 当前逻辑是先把整个Content表的所有数据全部加载到内存(调用ToList())之后再做后续处理,数据量稍大就会有严重的性能问题
实现方案

你需要的分页效果不需要自行计算行号过滤,直接用EF原生支持的Skip()(跳过指定行数)和Take()(取指定行数)方法即可,数据库层面就会完成分页过滤,性能远高于全表加载后过滤。
修改后的完整代码如下:

public JsonResult GetVoices(int? PageNumber, int? PageSize)
{
    // 参数合法性校验,给默认值避免空值、非法值报错
    int pageNum = PageNumber ?? 1;
    int pageSize = PageSize ?? 10;
    if (pageNum < 1) pageNum = 1;
    if (pageSize < 1) pageSize = 10;

    var skipCount = (pageNum - 1) * pageSize;
    
    var data = db.Content
        // 分页必须指定固定排序规则,否则分页结果会出现乱序、重复/缺失数据,可根据业务调整排序字段
        .OrderBy(c => c.Id)
        .Skip(skipCount)
        .Take(pageSize)
        // 转为内存集合后再处理行号,避免EF不支持相关语法报错
        .AsEnumerable()
        .Select((a, index) => new
        {
            // 行号为全局行号,如果只需要页内行号直接用index+1即可
            RowNumber = skipCount + index + 1,
            Id = a.Id,
            Title = a.Title,
            Description = a.Description,
            CreatedAt = a.CreatedAt
        })
        .ToList();
    
    return Json(data, JsonRequestBehavior.AllowGet);
}

内容的提问来源于stack exchange,提问作者Genkozal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:57:02