如何编写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
相关产品推荐
相关产品推荐

