【排序用法】.NET开源 ORM 框架 SqlSugar 系列
.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查询语法一定要牢记于心,才能应对后面更为复杂的形势。
1、OrderBy位置
1.1 Select 前面
var list =db.Queryable<Student>()
.LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
.OrderBy((st,sc)=>st.SchoolId)//写Select前面用法,正常都这么用
.Select((st,sc)=>new Dto(){ id=it.id ,Name=it.Name})
.ToList();
1.2 Select 后面
💥区别:特殊用法需要写在Select后面,比如Select中有计算列
var list =db.Queryable<Student>()
.LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
.Select((st,sc)=>new Dto(){ NewNum=st.Num+st.num2,Name=it.Name})
.MergeTable()//需要加上MergeTable对Select后的对象进行排序
.OrderBy(it=>it.NewNum)
.ToList();
2、多列排序
方式1: 逗号隔开,id asc ,name desc
方式2: 链式写法,Orderby().Orderby()
OrderBy(it=>new { it.Id, name=SqlFunc.Desc(it.Name) }).ToList();
//id asc ,name desc//也可以多个OrderBy
OrderBy(it=> it.Id).OrderBy(it=> SqlFunc.Desc(it.Name))
3、联表排序
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前面,写后面看标题1
.Select<ViewModelStudent>().ToList();
// order by st.id, sc.id desc 多级排序
💥注意:如果存在select一定要扔在select前面,不然 st sc别名拿不到
4、动态排序
4.1 字符串排序
💥注意:
- OrderByPropertyName 需要实体查询
- OrderBy 都可以
//1.Sql字符串,可以防止低级成本注入,支持自定义重写SQL注入验证StaticConfig.Check_FieldFunc重写这个委托方法就可以
var list =db.Queryable<Student>()
.LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
.OrderBy("st.id asc,sc.Id desc ") //这种就是填SQL你SQL什么样就是什么样 建议看4.2用法
.Select<ViewModelStudent>().ToList();
//技巧可以通过方法转转拿到真实列名:EntityMaintenance.GetDbColumnName<Order>("Id") 100%防注入//2.属性名排序 ,100%防注入,他会根据类中的名字去验证是否存在,不存在就报错
var list= db.Queryable<Student>().OrderByPropertyName("Id").Toist();//有实体才能用这个,没有实体不能用这个//3.使用合并表排序
var list =db.Queryable<Student>()
.LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)
.Select(it=>new {....})
.MergeTable()
.OrderByPropertyName("Id") //100%防注入,这样的好处可以去掉SQL的别名,适合多表排序
.ToList();
4.2 集合方式排序
//新功能推荐
List<OrderByModel> orderList = OrderByModel.Create(
new OrderByModel(){ FieldName="id",OrderByType=OrderByType.Desc},
new OrderByModel(){ FieldName="name"} //默认防注入:并且可以用StaticConfig.Check_FieldFunc重写验证机质
);
var list=db.Queryable<Student>().AS("order").OrderBy(orderList).ToList(); //技巧:获取类中字段名FieldName=db.EntityMaintenance.GetDbColumnName<Order>("Id");//100%防注入
4.3 多表去别名
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=@idorder by ("name asc")
所以单条查询是不需要加前缀的,上面的例子把多表转成了单表操作
5、随机排序取10条
db.Queryable<Student>().Take(10).OrderBy(st=>SqlFunc.GetRandom()).ToList(); //随机获取数据
6、OrderByIF
OrderByIF(IsOrderBy, it=>it.Id) //当条件IsOrderBy成立.OrderBy才生效
7、ThenBy
💥注意:SqlSugar中没有ThenBy 直接写2次OrderBy就行了
8、取最新10条
db.Queryable<Student>().Take(10).OrderBy(st=>SqlFunc.Desc(it.CreateTime)).ToList(); //order by createtime desc//也可以用这个重载
.OrderBy(it=>it.CreateTime,OrderByType.Desc)