【分页查询】.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的时间比查询数据的时间更长

相关推荐
小白考证进阶中11 小时前
Oracle OCP证书报考&考试全指南
数据库·oracle·oracle ocp·ocp认证·oracle认证·甲骨文认证·oracle ocp题库
Leon-Ning Liu12 小时前
【真实经验分享】 ORA-600 [qesmaGetTblSeg1]
数据库·oracle
与数据交流的路上12 小时前
MySQL 优化 -- 相关
数据库·mysql
Rooting++12 小时前
为什么mysql的表字段的collation会自动变
数据库·mysql
Wch1G0z8A12 小时前
Google 开源了啥,让 AI Agent 碰数据库不再是定时炸弹
数据库·人工智能·开源
tedcloud12313 小时前
cc-switch评测:多AI Coding Agent管理工具详解
数据库·人工智能·sql·学习·自动化
土狗TuGou13 小时前
SQL内功笔记 · 第8篇:事务的四大特性与隔离级别
数据库·笔记·后端·sql·mysql·oracle
Nturmoils14 小时前
一台 2C2G 服务器上的 KingbaseES 安装记录
数据库
SelectDB15 小时前
从 Machine-Readable 到 Agent-Ready:面向智能体的数据库接口演进
大数据·数据库·agent
画江湖Test15 小时前
Redis 块的原理
数据库·redis·缓存·性能优化