5.x文档地址
http://www.donet5.com/Home/Doc
与EF区别 sqlsugar queryable是引用类型,我们需用queryable.clone()解决一些问题
var queryable=db.Queryable<Student>(); //拼接会比EF方便些,不像EF需要queryable+= queryable.Where(it => it.Id==1); queryable.Where(it => it.Name=="a"); //防止queryable相互影响我们用clone解决 var id=queryable.Clone().Select(it=>it.Id).First(); var list=queryable.Clone().ToList();
案例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();使用参数化过滤
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);
}
}2016 © donet5.comApache Licence 2.0