SqlSugar分页查询

同步分页

 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 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的时间比查询数据的时间更长

 

posted @ 2024-01-16 15:04  yswenli  阅读(833)  评论(0编辑  收藏  举报