.NET开源 ORM 框架 SqlSugar 系列
- 【开篇】.NET开源 ORM 框架 SqlSugar 系列
- 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
- 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
- 【Db First】.NET开源 ORM 框架 SqlSugar 系列
- 【Code First】.NET开源 ORM 框架 SqlSugar 系列
- 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
- 【连接池】.NET开源 ORM 框架 SqlSugar 系列
- 【查询目录】.NET开源 ORM 框架 SqlSugar 系列
- 【查询基础】.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的时间比查询数据的时间更长