基本查询

1、简单示例

查所有、查单 条、聚合函数、是否存在 、模糊查询等例子

var getAll = db.Queryable<Student>().ToList();//查询所有
var top10= db.Queryable<Student>().Take(10).ToList();//查询前10
var getFirst = db.Queryable<Student>().First(it=>it.Id==1);//查询单条
var getAllNoLock = db.Queryable<Student>().With(SqlWith.NoLock).ToList();//SqlServer里面的withnolock
var getByPrimaryKey = db.Queryable<Student>().InSingle(2);//根据主键查询
var sum = db.Queryable<Student>().Sum(it=>it.Id);//查询总和
var isAny = db.Queryable<Student>().Where(it=>it.Id==-1).Any();//是否存在
var isAny2 = db.Queryable<Student>().Any(it => it.Id == -1);
var getListByRename = db.Queryable<School>().AS("Student").ToList();
var getByWhere = db.Queryable<Student>().Where(it => it.Id == 1 || it.Name == "a").ToList();
var list= db.Queryable<Student>().AS("student2019").ToList();//select * from student2019
var list2 = db.Queryable<Order>().Where(it =>it.Name.Contains("jack")).ToList();//模糊查询 name like '%'+@name+'%'


2、并集查询

 var q1 = db.Queryable<Student>().Select(it=>new Model{ name=it.Name });
 var q2 = db.Queryable<School>().Select(it => new Model { name = it.Name });
 var list = db.UnionAll(q1, q2).ToList();
SELECT * FROM  (SELECT  [Name] AS [name]  FROM [STudent]  UNION ALL
SELECT  [Name] AS [name]  FROM [School] ) unionTable


3、使用Sql函数

var getByFuns = db.Queryable<Student>().Where(it => SqlFunc.Between(it.Id,1,2)).ToList();


4、排序

//表达示排序
var list = db.Queryable<Student, School>((st, sc) =>new  JoinQueryInfos(JoinType.Left,st.SchoolId==sc.Id))
.OrderBy(st=>st.Id)
.OrderBy((st,sc)=>sc.Id,OrderByType.Desc)
.Select<ViewModelStudent>().ToList();

//表达示连写
var list = db.Queryable<Student, School>((st, sc) =>new  JoinQueryInfos(JoinType.Left,st.SchoolId==sc.Id))
.OrderBy(st=>new {st.Id,sc.Id})
.Select<ViewModelStudent>().ToList();

//动态排序
var list = db.Queryable<Student, School>((st, sc) =>new  JoinQueryInfos(JoinType.Left,st.SchoolId==sc.Id))
.OrderBy("st.id asc,sc.Id desc ")  //单表不需要加st.这种前缀
.Select<ViewModelStudent>().ToList();

//上面多表查询的时候动态排序需要加别名 ,如何去掉别名呢代码如下
var pageJoin =db.Queryable<Student,School>((st, sc) => new JoinQueryInfos(JoinType.Left, 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进行排序

//随机排序取10条
db.Queryable<Student>().Take(10).OrderBy(st=>Sqlfunc.Random()).ToList();


5、没有实体的查询

var list = db.Queryable<dynamic>().AS("order ").Where("id=id", new { id = 1 }).ToList();//没实体一样用


var list2 = db.Queryable<dynamic>("o").AS("order")
                        .AddJoinInfo("OrderDetail", "i", "o.id=i.OrderId")
                        .Where("id=id", new { id = 1 })
                        .Select("o.*").ToList();


5、操作In(1,2,3)

int [] allIds=new int[]{1,2,3};
db.Queryable<OrderItem>().Where(it => allIds.Contains(it.OrderId)).ToList() 
//sql select * from  OrderItem where odrderid in (1,3,3)


 7、操作IN 并且是2个字段逻辑

var ids = new int[] { 1, 3, 8, 5 };
Expressionable<Order> exp = new Expressionable<Order>();
foreach (var item in ids)
{
    exp.Or(it => it.Id == item && it.Name.Contains(item.ToString()));
}
var list= db.Queryable<Order>().Where(exp.ToExpression()).ToList();

//SELECT [Id],[Name],[Price],[CreateTime],[CustomId] FROM [Order]  WHERE
 //((((( [Id] = @Id0 ) AND  ([Name] like '%'+ CAST(@MethodConst1 AS NVARCHAR(MAX))+'%') ) 
//OR (( [Id] = @Id2 ) AND  ([Name] like '%'+ CAST(@MethodConst3 AS NVARCHAR(MAX))+'%') ))
 //OR (( [Id] = @Id4 ) AND  ([Name] like '%'+ CAST(@MethodConst5 AS NVARCHAR(MAX))+'%') ))
  //OR (( [Id] = @Id6 ) AND  ([Name] like '%'+ CAST(@MethodConst7 AS NVARCHAR(MAX))+'%') ))
//@Id0:1,@MethodConst1:1,@Id2:3,@MethodConst3:3,@Id4:8,@MethodConst5:8,@Id6:5,@MethodConst7:5


8、二次查询

var getAll = db.Queryable<Order>()
            .Select(it => new Order
            {
                Id = it.Id * 2,
                Name = it.Name
            })
            .MergeTable()//将上面的操作变成一个表 mergetable
            .GroupBy(it => it.Id)//对表mergetable进行分组
            .Select(it =>new{ id=it.Id }).ToList();//查询mergetable表里面的字段

生成的Sql如下:

SELECT `Id` FROM  
        (SELECT ( `Id` * @Id0 )AS `Id`,`Name` AS `Name`  FROM `Order`) MergeTable 
 GROUP BY `Id`
参数 @Id0:2