可以在Where中传入IConditionModel类型。SqlSugar提供了两个受支持的实现类:
public class ConditionalCollections : IConditionalModel { public ConditionalCollections(); public List<KeyValuePair<WhereType, ConditionalModel>> ConditionalList { get; set; } } public class ConditionalModel : IConditionalModel { public ConditionalModel(); public string FieldName { get; set; } public string FieldValue { get; set; } public ConditionalType ConditionalType { get; set; } public Func<string, object> FieldValueConvertFunc { get; set; } }对于一个集合里的兄弟 ConditionModel,表示查询条件都是 and 关系。而ConditionCollections则不同,其中ConditionList表示是一个键值对集合。键是WhereType类型,ConditionModel是值。我们先说说 WhereType:
public enum WhereType { And = 0, Or = 1 }分别表示And,Or。怎样理解呢?就是说,这一条键值对与前一个关系模型是And还是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();继续看一下WhereIF,WhereIF的使用就相对简单一点:
ISugarQueryable<T> WhereIF(bool isWhere, Expression<Func<T, bool>> expression);示例代码:
var query = context.Client.Queryable<Person>().WhereIF(string.IsNullOrEmpty(input), p=>p.Age>10);理解起来也很容易,第一个参数如何结果为False,则不执行后续的查询,否则就执行。
2. 一些高级玩法除了增删改查,SqlSugar还提供了一些别的有意思的机制,继续我们的探索吧。
2.1 批量操作SqlSugar提供了一种一次性记录很多操作然后统一提交执行的模式,之前的操作都是仅支持批量插入、批量修改、批量删除。在这种模式下,SqlSugar还支持了批量(插入、修改、删除)。也就是说,在一个批处理中,即可以插入也可以修改还可以删除。
那么我们来看如何让这个功能为我们所用吧:
void AddQueue();在IDeleteable、IInsertable、IUpdateable、ISugarQueryable都有这个方法,一旦调用这个方法就表示该条指令进行缓存不立即执行,直到调用SqlSugarClient.SaveQueues()。通过调用SaveQueues()保存到数据库中。
值得注意的是:
SqlSugar 虽然支持将查询也加入到批量操作的支持中,但是这部分在我看来更像是为了保证接口一致化而作的。个人并不推荐在批处理中加入查询,因为查询更多的需要及时准确快速,如果一旦陷入批处理中,查询就无法准确快速的返回数据了。
这样对于设定批处理的初衷,反而是违背的。当然最重要的一点,实际开发中这种情况很少遇到。
2.2 事务SQL本身支持事务,大多数ORM都支持事务,SqlSugar也不例外。SqlSugar通过哪些方法来自己实现一个事务呢?
在SqlSugarClient中执行:
public void BeginTran();会将SqlSugarClient做一个事务标记,表示之后的操作都是在事务中,直到事务提交或者回滚。
在SimpleClient中执行:
public ITenant AsTenant();返回一个ITenant实例,然后通过这个实例提交事务或者回滚事务。
注意,SqlSugar所有的事务都是针对 SqlSugarClient级别的,也就是说一个事务,一个SqlSugarClient。
2.3 原生SQL执行SqlSugar在很多地方都添加了原生Sql的支持。
比如说通过如下这种方式,可以使用Sql语句进行查询:
var t12 = context.Client.SqlQueryable<Student>("select * from student").Where(it=>it.id>0).ToPageList(1, 2);通过以下这种方式,执行SQL:
context.Client.Ado.ExecuteCommand(sql, parameters)然后,通过以下方式执行存储过程:
context.Client.Ado.UseStoredProcedure() 3. 总结优秀的ORM总是有各种各样的方案,也有各种各样的优点。SqlSugar到目前为止,可以告一段落了。当然,我还是剩下了一部分,留给大伙自己去探索挖掘。接下来,我将以Dapper作为《C# 数据操作系列》的最后内容。之后将会以项目的形式,带领大家去了解并学习asp.net core。
更多内容烦请关注我的博客《高先生小屋》