必须配合OrderBy()使用,因数据库不保证无序查询行序,Skip/Take依赖ORDER BY实现OFFSET-FETCH或LIMIT-OFFSET;深分页需防性能下降,建议加索引、限页码或改用游标分页。

EF Core 实现分页查询最常用、最直接的方式就是用 Skip() 和 Take() 方法,但要注意:必须配合 OrderBy()(或 OrderByDescending())使用,否则结果不稳定,甚至可能报错(尤其在 SQL Server 等数据库中启用了严格排序要求时)。
为什么必须加 OrderBy?
关系型数据库不保证无序查询的行顺序。跳过前 N 行时,若没有明确排序依据,每次执行 Skip(10).Take(5) 可能返回不同数据,甚至重复或遗漏。EF Core 在生成 SQL 时,也会将 ORDER BY 作为 OFFSET-FETCH(SQL Server)或 LIMIT-OFFSET(PostgreSQL/MySQL)的前提。
基础分页写法(推荐)
假设你要查第 3 页、每页 10 条(即跳过 20 条,取 10 条):
var pageNumber = 3; var pageSize = 10; <p>var pagedData = await context.Products .OrderBy(p => p.Id) // 必须有!建议用主键或有索引的字段 .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync();
登录后复制
带条件和总数的完整分页(常用场景)
实际项目中常需「当前页数据 + 总条数」用于前端分页控件。注意:不能直接在同一个查询链里用 Count() + Skip().Take(),因为会触发两次数据库查询(但这是合理且推荐的做法):
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~