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

相关推荐
菜鸟小九18 分钟前
mysql(锁)
数据库·mysql·oracle
c***421025 分钟前
【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用
数据库·性能优化
q***44811 小时前
PostgreSQL的备份方式
数据库·postgresql
v***59831 小时前
【SQL Server】超详细SQLServer日期转换、字符串、数学、聚合等常用函数大全(最新版)
数据库·sqlserver
q***23571 小时前
python的sql解析库-sqlparse
数据库·python·sql
q***92511 小时前
sql实战解析-sum()over(partition by xx order by xx)
数据库·sql
gladiator+1 小时前
Redis之BigKey的常见问题以及大厂相关面试题
java·数据库·redis
合方圆~小文1 小时前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
tanxiaomi2 小时前
Redis相关面试题
数据库·redis·缓存
钮钴禄·爱因斯晨2 小时前
【探索实战】KuratorGitOps 多环境配置管理与合规审计
数据库