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别名拿不到
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")
所以单条查询是不需要加前缀的,上面的例子把多表转成了单表操作
db.Queryable<Student>().Take(10).OrderBy(st=>SqlFunc.GetRandom()).ToList(); //随机获取数据
OrderByIF(IsOrderBy, it=>it.Id) //当条件IsOrderBy成立.OrderBy才生效
2016 © donet5.comApache Licence 2.0