排序 OrderBy

表达式排序

var list = db.Queryable<Student>().LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
.OrderBy(st=>st.Id)//升序
.OrderBy((st,sc)=>sc.Id,OrderByType.Desc)//倒序 
.Select<ViewModelStudent>().ToList();
// order by st.id, sc.id desc  多级排序

注意:如果存在Select一定要扔在select前面,不然 st sc别名拿不到

多个OrdeBy写一起

OrderBy(it=>new {  it.Id, name=SqlFunc.Desc(it.Name) }).ToList();
//id asc ,name desc


动态排序

//通过类中属性名获取数据库字段名
var orderByFieldName=db.EntityMaintenance.GetDbColumnName<Order>("Id");//防注入
var  list=db.Queryable<Student>().OrderBy(orderByFieldName+" asc ");


var list =db.Queryable<Student>()
.LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
.OrderBy("st.id asc,sc.Id desc ")  //多表查询有别名(st&sc) ,多表去别名下面有介绍
.Select<ViewModelStudent>().ToList();

上面如何去掉别名呢代码如下

var pageJoin = db.Queryable<Student>()
                .LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
                .Select((st, sc) => new {
                 id = st.Id,
                 name = sc.Name
              })
.MergeTable()//将查询结果集变成表MergeTable
.Where(it => it.id == 1).OrderBy("name asc").ToList();//对表MergeTable进行排序

生成的Sql相当于

select *  
from 
     (select st.id as id,sc.name as name from xx join xx on ... ) MergeTable  
     --多表已经变成了单表
      where id=@id
      order by ("name asc")

所以单条查询是不需要加前缀的,上面的例子把多表转成了单表操作

随机排序取10条

db.Queryable<Student>().Take(10).OrderBy(st=>SqlFunc.GetRandom()).ToList(); //随机获取数据


OrderByIF

OrderByIF(IsOrderBy, it=>it.Id) //当条件IsOrderBy成立.OrderBy才生效


文档:SqlSugar5.0