同步分页
int pagenumber= 1; // pagenumber是从1开始的不是从零开始的
int pageSize = 20;
int totalCount=0;
//单表分页
var page = db.Queryable<Student>().ToPageList(pagenumber, pageSize, ref totalCount);
//如果SqlServer不想有Rownumber可以用 ToOffsetPage 较新版本支持
//多表分页
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);
|
异步分页
RefAsync< int > total = 0; //REF和OUT不支持异步,想要真的异步这是最优解
Db.Queryable<Order>().ToPageListAsync(pagenumber, pageSize, total); //ToPageAsync
|
生成的Sql
SELECT * FROM
( SELECT [ID],[SchoolId],[ Name ],[CreateTime],ROW_NUMBER()
OVER( ORDER BY GetDate()) AS RowIndex FROM [STudent]) T
WHERE RowIndex BETWEEN 1 AND 20
|
SqlSever2012分页
5.0.3.2支持
把 ToPageList 换成 ToOffsetPage //offest分页
|
Oracle高性能分页
新功能 : 5.1.2.6-preview03
Oracle分了2种分页,特殊情况下性能慢可以换下面这种
把 ToPageList 换成 ToOffsetPage //offest分页
|
获取行号
方式1:只支持SqlServer或者Oracle ( row_index )
[SugarColumn(IsIgnore= true )] //需要加上
public int RowIndex{ get ; set ;} //行号 序号
db.Queryable<Student>().ToPageList(pageIndex, pageSize, ref totalCount)
|
方式2:都通用
//其他数据库可以这么实现
int i = 1;
var getAll = db.Queryable<Order>().Mapper((it,cache)=> {
it.num= i; //有分页的话需要计算一下 (pageindex-1)*pagesize+i
i++;
}).ToList();
|
方式3:开窗口函数 (数据库需要支持开窗口函数才能用)
//开窗口函数实现
//index = SqlFunc.RowNumber($"{it.Id} asc ,{it.Name} desc ");
|
Count为什么不是long
答: 1亿数据Count就要1分钟,别说int.max的20亿数据了,所以超过1000万以上的查询就不建议查询count,因为count的时间比查询数据的时间更长
标签:分页,pageSize,int,查询,ToPageList,Queryable,SqlSugar,Name From: https://www.cnblogs.com/yswenli/p/17967705