首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
c#如何实现分页查询_c#分页查询最全用法总结

c#如何实现分页查询_c#分页查询最全用法总结

热心网友
33
转载
2026-05-06

SQL Server分页首选OFFSET-FETCH,需配合ORDER BY且参数化传值;EF Core用Skip/Take自动翻译,避免内存分页;大数据量时应改用游标分页。

c#如何实现分页查询_c#分页查询最全用法总结

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

SQL Server 中用 OFFSET-FETCH 做分页最直接

说到在SQL Server里做分页,2012及以上版本提供的OFFSET-FETCH子句,无疑是那个最标准、最清晰的选项。它语义一目了然,写法也足够简洁,完全可以作为首选方案。比起依赖ROW_NUMBER()函数或者写复杂的嵌套子查询,它的执行计划通常也更优。

不过,这里有个常见的“坑”得留意:千万别把OFFSETFETCH的顺序写反了,更别忘了ORDER BY子句——它是必须存在的,否则数据库会直接报错"The OFFSET clause is missing in the ORDER BY clause."

  • 标准写法是:OFFSET @skip ROWS FETCH NEXT @take ROWS ONLY。其中,@skip = (页码 - 1) * 每页大小,@take = 每页大小。
  • 注意,OFFSET值为0是合法的,但不能为负数;FETCH则必须是个正整数。
  • 如果排序字段存在重复值,分页结果可能会出现“漂移”,变得不稳定。一个稳妥的规避方法是:在ORDER BY子句末尾,追加一个唯一列(比如主键)。

Entity Framework Core 中用 Skip()Take() 就够了

如果你在用Entity Framework Core,事情就简单多了。直接使用Skip()Take()这两个方法,框架会自动帮你翻译成底层数据库对应的分页语法——SQL Server对应OFFSET-FETCH,MySQL对应LIMIT,PostgreSQL对应LIMIT-OFFSET。这意味着,你完全不必手动去拼接那些SQL字符串。

但这里有个性能“杀手”需要警惕:那就是在内存中进行分页。具体来说,就是先调用ToList()ToListAsync()把所有数据拉到内存里,然后再进行SkipTake操作。一旦数据量大了,这种操作会导致整个数据集被完整加载,响应速度会急剧下降。

  • 务必确保Skip()Take()是在IQueryable上调用,并且要在最终的ToListAsync()执行之前。
  • 避免在Where条件筛选后,紧接着调用AsEnumerable()ToList(),然后再分页。
  • 如果需要动态构建查询条件,尽量保持IQueryable的链式传递,不要提前触发查询执行。

手写 ADO.NET 分页要防 SQL 注入和类型转换失败

当需要手写ADO.NET代码进行分页时,安全性和健壮性就成了首要考量。直接使用字符串拼接来构造SQL(比如"... LIMIT " + pageSize)是极不安全的做法,也为后期维护埋下隐患。正确的做法是:全部使用参数化查询,包括OFFSETFETCH的数值。

一个常见的错误是把页码或页大小当作字符串类型的参数传递,这会导致SQL报错,例如"Incorrect syntax near '@offset'"。原因在于,SQL参数只能用于代表值,不能用于替代关键字或语法结构的位置。

  • 在SQL Server中:使用OFFSET @skip ROWS FETCH NEXT @take ROWS ONLY,并确保参数类型为int
  • 在MySQL中:使用LIMIT @take OFFSET @skip,同样使用MySqlParameter,并且OFFSET参数必须为整数类型(不能是longstring)。
  • 记住,永远不要试图用string.Format或者字符串插值($"")来拼接分页参数,这是一个高危操作。

大数据量下 OFFSET 性能会明显下降

当数据量非常庞大时,OFFSET分页的短板就会暴露出来。想象一下,当OFFSET值变得很大(例如要查询第10000页,每页20条,那么OFFSET就是199980),数据库引擎仍然需要扫描并跳过前面所有的行,这会导致IO和CPU开销急剧上升。

这个问题在C#应用层是无法解决的,但开发者必须清楚何时应该切换策略。这时,“游标分页”(cursor-based pagination)就派上用场了。它的核心思路是:利用上一页最后一条记录的排序字段值,作为查询下一页的起点。

  • 这种分页方式特别适合时间线类列表(按CreateTime DESC排序)或者ID有序增长的场景。
  • 典型的写法是:WHERE CreateTime
  • 它的局限性在于无法直接跳转到任意指定页,但对于大多数只需要“上一页”、“下一页”操作的前端分页控件来说,这恰恰是匹配的。其优势在于首屏加载快、翻页性能稳定,不会出现深度分页时的性能断崖。

话说回来,在实际项目中,90%的分页需求使用EF Core的Skip/Take组合就完全能够胜任。如果真的遇到了需要在百万级数据中深度翻页的场景,那么问题的关键可能不在于OFFSET怎么写更快,而是需要重新审视整个查询逻辑的设计了。

来源:https://www.php.cn/faq/2321290.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

C#怎么使用ReadOnlySpan_C#只读内存切片性能优化教程【高级】
编程语言
C#怎么使用ReadOnlySpan_C#只读内存切片性能优化教程【高级】

C ReadOnlySpan 使用指南:高性能只读内存切片优化技巧【高级教程】 在 NET 高性能编程实践中,尤其是在字符串处理场景,一个公认的高效策略是:直接采用 ReadOnlySpan 来替代传统的 string 参数以及中间的 Substring 调用。这是目前实现零分配、低开销处理的最

热心网友
05.06
c#如何实现分页查询_c#分页查询最全用法总结
编程语言
c#如何实现分页查询_c#分页查询最全用法总结

SQL Server分页首选OFFSET-FETCH,需配合ORDER BY且参数化传值;EF Core用Skip Take自动翻译,避免内存分页;大数据量时应改用游标分页。 SQL Server 中用 OFFSET-FETCH 做分页最直接 说到在SQL Server里做分页,2012及以上版本提

热心网友
05.06
c#如何批量插入数据_c#批量插入数据完整教程与实战案例
编程语言
c#如何批量插入数据_c#批量插入数据完整教程与实战案例

C 万级数据批量插入:SqlBulkCopy 实战精要 在C 中进行大规模数据插入,性能是首要考量。当数据量达到万级甚至更高时,常规的逐条插入方法会迅速成为性能瓶颈。那么,有没有一种既高效又稳定的解决方案呢?答案是肯定的。 用 SqlBulkCopy 实现高速批量插入 开门见山地说,在C 生态中,

热心网友
05.06
c#如何使用TestContainers集成测试_c#TestContainers集成测试的最佳实践与常见坑点
编程语言
c#如何使用TestContainers集成测试_c#TestContainers集成测试的最佳实践与常见坑点

C 中使用TestContainers进行集成测试:最佳实践与常见坑点 想在 NET 里玩转 TestContainers?这事儿说简单也简单,说麻烦也麻烦。简单在于,它确实能让你用几行代码就拉起一个数据库或中间件进行测试;麻烦在于,从环境配置到代码编写,每一步都有几个“经典”的坑在等着你。今天,

热心网友
05.06
C#怎么操作WPF Canvas画布绘图 C#如何在WPF Canvas上用代码动态绘制图形和连线【控件】
编程语言
C#怎么操作WPF Canvas画布绘图 C#如何在WPF Canvas上用代码动态绘制图形和连线【控件】

C WPF Canvas画布绘图完全指南:代码动态绘制图形与连线详解 Canvas直接添加子元素导致错位或不显示的解决方案 许多C 开发者在初次使用WPF Canvas控件进行动态绘图时,常会遇到一个典型问题:为何通过代码添加的Rectangle矩形或Line线条无法正常显示,或者出现位置偏移?

热心网友
05.06

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

荣耀400pro关机要按几秒
电脑教程
荣耀400pro关机要按几秒

荣耀400 Pro正确关机全指南:从常规操作到故障应对详解 需要关闭您的荣耀400 Pro手机?日常操作其实非常简便。只需长按位于机身右侧的电源键约3秒钟,屏幕上便会浮现一个简洁的半透明菜单,其中明确列出了“关机”、“重启”以及“紧急呼叫”选项。直接点击“关机”,系统将启动一次10秒的安全倒计时,随

热心网友
05.06
红米K30Pro如何拆后盖胶怎么清理
电脑教程
红米K30Pro如何拆后盖胶怎么清理

红米K30 Pro后盖拆解教程:专业工具与细致手法的完美结合 红米K30 Pro的后盖采用了高强度背胶配合隐藏式螺丝的双重固定设计,想要实现无损拆解,绝非依靠蛮力可以完成。整个操作流程对加热温度、撬启手法以及清洁标准都有严格要求,任何环节的疏忽都可能导致部件损伤。具体而言,其后盖边缘使用了耐高温的工

热心网友
05.06
三星zflip电池百分比需要root吗
电脑教程
三星zflip电池百分比需要root吗

无需Root权限:三星Galaxy Z Flip系列电量数字显示设置全解析 很多三星折叠屏手机用户都想知道,如何在状态栏直接查看精确的电池百分比数字,是否必须获取Root权限才能实现?实际上完全不需要。三星自Galaxy Z Flip 5、Z Flip 4等主流机型开始,已在系统层面内置了这一实用功

热心网友
05.06
笔记本开机自检时能看到DDR3或DDR4吗
电脑教程
笔记本开机自检时能看到DDR3或DDR4吗

笔记本开机自检信息虽不直接标注“DDR3”或“DDR4”,但联想、戴尔、华硕等品牌BIOS画面常以“PC3-”或“PC4-”编码间接揭示内存代际。UEFI自检显示的内存频率(如2400MHz 3200MHz)结合JEDEC规范可辅助推断:PC3对应DDR3,PC4对应DDR4。更高精度的识别方案包括

热心网友
05.06
空调制冷但不太凉是压缩机问题吗?
电脑教程
空调制冷但不太凉是压缩机问题吗?

空调制冷不足怎么办?先别急着维修压缩机,这些问题更常见 夏天开空调却感觉不够凉爽?很多朋友的第一反应是压缩机坏了,其实压缩机故障的概率相对较低。根据维修行业的大数据统计,绝大多数制冷效果不佳的情况,源于几个容易被忽略的日常维护与环境因素。滤网积尘、制冷剂泄漏、外机散热不良才是真正的高发原因。盲目更换

热心网友
05.06