查询用例

1、简单示例

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

var getAll = db.Queryable<Student>().ToList();//查询所有
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、 分组查询

只有在聚合对象需要筛选的时候才会用到Having,一般分组查询用不到可以去掉

var list = db.Queryable<Student>()
             .GroupBy(it => new { it.Id, it.Name })
             .Having(it => SqlFunc.AggregateAvg(it.Id) > 0)//不是聚合函数用Where就可以了
             .Select(it => new { idAvg = SqlFunc.AggregateAvg(it.Id), name = it.Name })
             .ToList();
//SELECT AVG([Id]) AS[idAvg], [Name] AS[name]  FROM[Student] GROUP BY[Name],[Id] HAVING(AVG([Id]) > 0 )


3、 去重查询

var list = db.Queryable<Student>().Distinct().Select(it => new { it.Name }).ToList();
SELECT  DISTINCT  [Name] AS [Name]  FROM [STudent]


4、分页

//同步分页 
 int pageIndex = 1; 
 int pageSize = 20;
 int totalCount=0;
 var page = db.Queryable<Student>().ToPageList(pageIndex, pageSize, ref totalCount);

//异步分页 
RefAsync<int> total = 0;
Db.Queryable<Order>().ToPageListAsync(pageIndex, pageSize, total);


//分页Sql
  //SELECT * FROM 
            //(SELECT [ID],[SchoolId],[Name],[CreateTime],ROW_NUMBER() 
            //   OVER(ORDER BY GetDate())AS RowIndex FROM [STudent]) T
   //WHERE RowIndex BETWEEN 1 AND 20


5、并集查询

 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


6、使用Sql函数

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


7、排序

//表达示排序
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进行排序



8、没有实体的查询

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();



 9、异步

异步就是在原有的方法后面加Async例如,ToList改成ToListAsync

异步分页需要注意传参有点不同代码如下

var task1=db.Queryable<Order>().FirstAsync();
var task2 = db.Queryable<Order>().Where(it=>it.Id==1).ToListAsync();
 
//分页需要特别注意用法
RefAsync<int> total = 0;
Db.Queryable<Order>().ToPageListAsync(1, 2, total);


10、分组取第一条,部分数据库支持

var list3 = db.Queryable<Student>()
.PartitionBy(it => new { it.Id, it.Name }).Take(1).ToList();



11、操作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)


 12、操作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