简单动态

案例1: WhereIF函数

根据条件判段是否执行过滤,我们可以用WhereIf来实现,true执行过滤,false则不执行

var list = db.Queryable<Student>()
    .WhereIF(!string.IsNullOrEmpty(a),it => it.Name == a)
    .WhereIF(!string.IsNullOrEmpty(b), it => it.Name == b).ToList();




案例2.:MergeTable 函数 4.4

是将多表查询的结果Select里的内容变成一张表, 如果是多表查询的时候,我们无论是使用 where 还是 orderBy 都需要加别名,这样我们就不能实现动态排序,因为我不知道别名叫什么, 可以用MergeTable解决这个问题

以前

var pageJoin = db.Queryable<Student, School>((st, sc) => new object[]
    {
        JoinType.Left, st.SchoolId == sc.Id
    }) 
    .Where(st=>st.id==1)//别名是st
    .OrderBy("sc.name asc")//别名是sc
    .Select((st,sc)=>new { id=st.Id,name=sc.Name})
    .ToList();

现在

var pageJoin = db.Queryable<Student, School>((st, sc) => new object[]
    {
        JoinType.Left,st.SchoolId==sc.Id
    })
    .Select((st,sc) => new
    { 
        id = st.Id,
        name = sc.Name
    })
    .MergeTable()
    .Where(XXX=>XXX.id==1).OrderBy("name asc").ToList();//别名不限




案例3: SqlQueryable 4.5.2.5

可以方便的把SQL变成表来操作

var t12 = db.SqlQueryable<Student>("select * from student").ToPageList(1, 2);




案例4: 将表单组装成 List<ConditionalModel>实现查询 4.5.9

 List<IConditionalModel> conModels = new List<IConditionalModel>();
 conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" });
 conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1" });
 var student = db.Queryable<Student>().Where(conModels).ToList();
//4.6.4.4 版本支持了 复杂的OR 
// and id=100 and (id=1 or id=2 and id=1) 
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "100" });
conModels.Add(new ConditionalCollections() { ConditionalList=
new List<KeyValuePair<WhereType, SqlSugar.ConditionalModel>>()
{
    new  KeyValuePair<WhereType, ConditionalModel>
    ( WhereType.And ,
    new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" }),
    new  KeyValuePair<WhereType, ConditionalModel> 
    (WhereType.Or,
    new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "2" }),
    new  KeyValuePair<WhereType, ConditionalModel> 
    ( WhereType.And,
    new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "2" })
}
});
var student = db.Queryable<Student>().Where(conModels).ToList();



案例5: 拼接拉姆达 4.5.9.8

var exp= Expressionable.Create<Student>()
      .OrIF(1==1,it => it.Id == 11)
      .And(it=>it.Id==1)
      .AndIF(2==2,it => it.Id == 1)
      .Or(it =>it.Name == "a1").ToExpression();//拼接表达式
                
var list=db.Queryable<Student>().Where(exp).ToList();


复杂动态


Queryable是支持字符串与拉姆达混用或者纯字符串拼接模式,可以满足复杂的一些需求


例子1:

            var queryable = db.Queryable<Student>("t");

            queryable.Where("t.id in (select id from xxx)");

            queryable.Where(it => it.Id == 1);

            //更多操作拼接qureyable  

            var result = queryable.Select(@"
                  id,
                  name,
                  (select name form school where shoolid=t.id) as schoolName
                   ").ToList();


例子2:

dynamic join3 = db.Queryable("Student", "st")
		.AddJoinInfo("School", "sh", "sh.id=st.schoolid")
		.Where("st.id>@id")
		.AddParameters(new { id = 1 })
		.Select("st.*").ToList(); //也可以Select<T>(“*”).ToList()返回实体集合


例子3:

var list = db.Queryable<Student>().
                Select(it => new Student()
                {
                    Name = it.Name,
                    Id = SqlFunc.MappingColumn(it.Id, "(select top 1 id from school)") // 动态子查询
                }).ToList();


安全拼SQL

使用参数化过滤

private static void Where()
{
 var db = GetInstance();
 string value = "'jack';drop table Student";
 var list = db.Queryable<Student>().Where("name=@name", new { name = value }).ToList();
 //没有发生任何事情
}


字段是无法用参数化实现的,我们就可以采用这种方式过滤

private static void OrderBy()
{
 var db = GetInstance();
 try
 {
    var propertyName = "Id'"; //类中的属性的名称
    var dbColumnName = db.EntityProvider.GetDbColumnName<Student>(propertyName);
    var list2 = db.Queryable<Student>().OrderBy(dbColumnName).ToList();
 }
 catch (Exception ex)
 {
    Console.WriteLine(ex.Message);
 }
}



收藏到朋友圈: