c#如何使用LINQ Skip和Take分页_c#LINQ Skip和Take分页项目实例附完整源码

星枫姑娘_9188

星枫姑娘_9188

2026-04-04

726人浏览

原创

Skip和Take分页必须配合OrderBy才安全,否则因数据顺序不固定会导致重复或漏项;EF Core中SQL若无ORDER BY,数据库返回顺序可能波动;内存集合分页是纯内存操作,而IQueryable分页由数据库执行。

c#如何使用linq skip和take分页_c#linq skip和take分页项目实例附完整源码

Skip 和 Take 不能直接当分页用,必须配合 OrderBy(或 OrderByDescending)才安全——否则数据顺序不固定,翻页会重复或漏项。

为什么 Skip/Take 分页必须加 OrderBy

数据库或内存集合中,如果没有显式排序,Skip 的“跳过前 N 条”行为没有确定依据。尤其在 EF Core 查询数据库时,SQL 不带 ORDER BY,数据库返回顺序可能随执行计划、索引、缓存变化而波动。

常见错误现象:
第 1 页显示 ID 5/8/12,第 2 页又出现 ID 5;或者某条记录始终查不到。

实操建议:
• 必须在 Skip 前调用 OrderBy(x => x.Id) 或其他稳定字段(如时间戳+ID 组合)
• 避免用 OrderBy(x => Guid.NewGuid()) 这类非确定性排序
• 若按用户输入动态排序,确保排序字段有索引,且为空值时行为明确(如 OrderBy(x => x.Name ?? ""))

如何写一个安全的分页查询(EF Core + LINQ)

典型场景:Web API 返回第 page 页、每页 pageSize 条的 User 列表。

实操建议:
• 先构建 IQueryable,再链式调用 OrderBy → Skip → Take
• 不要先 ToList() 再分页(会把全表拉到内存)
• 检查 page 和 pageSize 是否合法(如 page 直接返回空)

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
var users = context.Users
    .OrderBy(u => u.Id) // 关键:必须存在
    .Skip((page - 1) * pageSize)
    .Take(pageSize)
    .ToList();

分页总数怎么查?别用 Count() 做两次查询

只查数据列表时用 Take,但前端常需总条数渲染分页控件。如果额外执行 Count(),会触发第二次 SQL 查询,性能浪费明显。

实操建议:
• EF Core 6+ 可用 CountAsync() 单独查总数(仍是两次查询,但至少异步)
• 更优方案是用 AsNoTracking() 减少变更跟踪开销
• 真正高效的做法:用原始 SQL 或存储过程一次性返回数据 + 总数(如 SQL Server 的 OFFSET-FETCH + COUNT(*) OVER())
• 简单项目可接受两次查询,但务必加 ConfigureAwait(false)(若在 ASP.NET Core 中)

内存集合分页(List)和数据库分页的区别

对 List 调用 Skip/Take 是纯内存操作,快但无索引优化;对 IQueryable(如 EF Core DbSet)则是翻译成 SQL,依赖数据库引擎。

容易踩的坑:
• 把 IQueryable 误当成 IEnumerable:调用 .AsEnumerable() 后再 Skip,等于先把全量数据查出来
• 在 Where 后直接 Skip,但没注意 Where 是否已触发执行(如用了 .ToList())
• Take(0) 是合法的,但 Skip(-1) 会抛 ArgumentOutOfRangeException

复杂点在于:分页不是单纯数学计算,它和排序、数据一致性、查询性能深度耦合。哪怕代码只改一行——比如删掉 OrderBy——线上就可能出数据错乱。别信“先跑起来再说”。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

1112

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

3271

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

925

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2655

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

352

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

429

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

631

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

329

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习