【分页查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列

  1. 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  2. 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
  3. 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
  4. 【Db First】.NET开源 ORM 框架 SqlSugar 系列
  5. 【Code First】.NET开源 ORM 框架 SqlSugar 系列
  6. 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
  7. 【连接池】.NET开源 ORM 框架 SqlSugar 系列
  8. 【查询目录】.NET开源 ORM 框架 SqlSugar 系列
  9. 【查询基础】.NET开源 ORM 框架 SqlSugar 系列

💦万丈高楼平地起,做开发想要技术精进,必须要有扎实的基础功底。基础SQL查询语法一定要牢记于心,才能应对后面更为复杂的形势。

01. 核心方法

分页主要用到的核心方法有两个,分别是 ToPageList ToOffsetPage

💥注意事项:

  • 如果数据库版本较新可以用 ToOffsetPage 取代 ToPageList
  • ToPageList 对低版本数据库支持更好 (兼容性较好)
  • ToPagedList有的不是sqlsugar封装的
cs 复制代码
.ToPageList(pagenumber, pageSize)// 不返回Count
.ToPageList(pagenumber, pageSize, ref totalCount)//返回Count
.ToPageList(pagenumber, pageSize, ref totalCount,ref totalPage)//返回Count+总页数

02. 同步分页

💥注意事项:

  • 如果SqlServer不想有 Rownumber 可以用 ToOffsetPage 较新版本支持
  • pagenumbe是从1开始的不是从零开始的
cs 复制代码
 int pagenumber= 1;
 int pageSize = 20;
 int totalCount=0;
 //单表分页
 var page = db.Queryable<Student>().ToPageList(pagenumber, pageSize, ref totalCount);
 
 //多表分页
 var list = db.Queryable<Student>().LeftJoin<School>((st,sc)=>st.SchoolId==sc.Id)
 .Select((st,sc)=>new{Id=st.Id,Name=st.Name,SchoolName=sc.Name})
 .ToPageList(pageIndex, pageSize, ref totalCount);

03. 异步分页

💥注意事项: REF 和 OUT 不支持异步,想要真的异步这是最优解。

cs 复制代码
RefAsync<int> total = 0;//REF和OUT不支持异步,想要真的异步这是最优解
 Db.Queryable<Order>().ToPageListAsync(pagenumber, pageSize, total);//ToPageAsync

生成的Sql

cs 复制代码
 SELECT * FROM 
            (SELECT [ID],[SchoolId],[Name],[CreateTime],ROW_NUMBER() 
             OVER(ORDER BY GetDate())AS RowIndex FROM [STudent]) T
   WHERE RowIndex BETWEEN 1 AND 20

04. SqlSever2012分页 OFFSET

cs 复制代码
把  ToPageList 换成  ToOffsetPage   //offest分页

05. Oracle高性能分页

新功能 : 5.1.2.6-preview03

Oracle分了2种分页,特殊情况下性能慢可以换下面这种

06. 获取行号

方式1:只支持SqlServer或者Oracle ( row_index )

需要加上特性:[SugarColumn(IsIgnore=true)]

cs 复制代码
[SugarColumn(IsIgnore=true)]//需要加上
public int RowIndex{get;set;} //行号 序号
 
db.Queryable<Student>().ToPageList(pageIndex, pageSize, ref totalCount)

方式2:通用,兼容性好 👍

有分页的话需要计算一下 (pageindex-1)*pagesize+i

cs 复制代码
//其他数据库可以这么实现
 int i = 1;
 var getAll = db.Queryable<Order>().Mapper((it,cache)=> {
                it.num= i;//有分页的话需要计算一下 (pageindex-1)*pagesize+i
                i++; 
 }).ToList();

方式3:开窗口函数 (数据库需要支持开窗口函数才能用)

cs 复制代码
//开窗口函数实现
//index  =  SqlFunc.RowNumber($"{it.Id} asc ,{it.Name} desc ");

07. Count为什么不是long ❓

答: 1亿数据Count就要1分钟,别说int.max的20亿数据了,所以超过1000万以上的查询就不建议查询count,因为count的时间比查询数据的时间更长

相关推荐
VX:Fegn08953 小时前
计算机毕业设计|基于ssm + vue超市管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
chipsense3 小时前
电流传感器型号从数据库查询并排序输出到网页的方法
数据库·php·传感器·霍尔电流传感器
踢足球09293 小时前
寒假打卡:2026-01-28
数据库·oracle
麦聪聊数据3 小时前
智慧医疗数据互联互通:使用 QuickAPI 构建实时诊疗数据交换层
数据库·sql·安全
风吹落叶花飘荡3 小时前
2026年mysql数据库迁移(全流程)
数据库·mysql
2301_822382763 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
m0_748229993 小时前
Laravel8.X核心功能全解析
开发语言·数据库·php
液态不合群4 小时前
【面试题】MySQL 的索引下推是什么?
数据库·mysql
2301_790300964 小时前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
Code blocks5 小时前
SpringBoot从0-1集成KingBase数据库
数据库