通用查询用途

一般我们Grid控件,会有很多条件传给后台,如果每个条件都写一个逻辑的话,那么工作量将非常大,所以通用查询功能是每个软件必备的,

SqlSugar将通用查询封装到支持了树型条件,并且支持所有常用的操作,用SqlSugar或者不用SqlSugar的都可参参考一下

1、简单多条件多动参数

创建数据库对象

 //创建数据库对象 SqlSugarClient   
 SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            ConnectionString = "Server=.xxxxx",//连接符字串
            DbType = DbType.SqlServer, //数据库类型
            IsAutoCloseConnection = true //不设成true要手动close

前台传的JSON格式   [{},{},{}]

{"FieldName":"id","ConditionalType":"0","FieldValue":"1"}, {"FieldName":"name","ConditionalType":"0","FieldValue":"jack"}
//手动构造
var conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel{ FieldName = "id",ConditionalType=ConditionalType.Equal,FieldValue="1"});
conModels.Add(new ConditionalModel{ FieldName = "name",ConditionalType=ConditionalType.Equal,FieldValue="jack"});  
//5.0.5.1 Json直接序列化
var conModels= db.Context.Utilities.JsonToConditionalModels(json)  
var student = db.Queryable<Student>().Where(conModels).ToList();
//select * from Student where id=1 and name = 'jack'

这种比较简单 多一条记录就多一个AND

2、二级多条件动态参数

这种模式对于表格查询已经够用了,支持到2级查询,并且AND OR都比较灵活了

[ {"FieldName": "id","FieldValue": "1","ConditionalType": 10}, 
  {"FieldName": "id","FieldValue": null,"ConditionalType": 12}, 
    "ConditionalList": [{
        "Key": 1,
        "Value": {
            "FieldName": "id",
            "FieldValue": "2",
            "ConditionalType": 0
        "Key": 0,
        "Value": {
            "FieldName": "id",
            "FieldValue": "2",
            "ConditionalType": 0
//5.0.5.1 Json直接序列化
var whereList= db.Context.Utilities.JsonToConditionalModels(json);
var list = db.Queryable<Order>().Where(whereList).ToList();

 生成的Sql: 

 WHERE   [id] <> @Conditid0   
    AND    [id]  IS NOT  NULL   
    OR     (   [id] = @Conditid10000   AND   [id] = @Conditid20000   )

说明:ConditionalList 第一个Key为1 那么就会生成  Or( 条件 )

          ConditionalList 第一个Key为0 那么就会生成  And( 条件 )

          Key表式运算符:   And =0,  Or=1 

例子1:ConditionalList  集合中 有3条记录 key =1 , key =0 ,key=1

生成的Sql     OR(条件 AND 条件 OR条件)

例子2:ConditionalList  集合中 有1条记录 key =1 

生成的Sql     OR(条件)

例子3:ConditionalList  集合中 有4条记录 key =0,key=1,key=1,key=1 

生成的Sql     AND (条件 OR 条件 OR条件 OR 条件)

这种模式只支持2级操作,需要更多层级就实现不了了

3、树型动态条件 (请升级5.0.5.1)

这种就比较强大了,一般用于表的公开API等操作,可以构造任何层级的条件 ,可以支持树型条件

Key表式运算符:   And =0,  Or=1,  null=-1

"ConditionalList": [{ "Key": -1, "Value": { "FieldName": "id", "FieldValue": "2", "ConditionalType": 0 "Key": 0, "Value": { "FieldName": "name", "FieldValue": "2", "ConditionalType": 0 "Key": 0, "Value": { "ConditionalList": [{ "Key": -1, "Value": { "FieldName": "price", "FieldValue": "1", "ConditionalType": 0 "Key": 0, "Value": { "FieldName": "CustomId", "FieldValue": "1", "ConditionalType": 0

生成的SQL:  

WHERE  (   [id] = @Conditid10001   
      AND   [name] = @Conditname20001  
      AND(   [price] = @Conditprice10000   AND   [CustomId] = @ConditCustomId20000   )  )
var conditionalModels = db.Context.Utilities.JsonToConditionalModels(json);
var list = db.Queryable<Order>().Where(conditionalModels).ToList();  

 更多用例:https://www.donet5.com/Ask/9/14378

3、操作符解释

ConditionalTypek是一个枚举

枚举枚举值描述 Equal  GreaterThan  GreaterThanOrEqual  LessThan  LessThanOrEqual 

正确格式   X,Y,Z 

错误格式   'X','Y','z'

NotIn  Not in操作 参数和in一样 LikeLeft  LikeRight  NoEqual  IsNullOrEmpty  是null或者'' IsNot 

情况1   value不等于null

情况2   value等于null 

字段 is not null

NoLike  模糊查询取反 EqualNull 

情况1   value不等于null

字段= x

情况2   value等于null 

字段 is null

foreach(var r in conModels)
   r.FieldName =db.EntityMaintenance.GetDbColumnName<Order>(r.FieldName );//这样就支持了用实体类中的属性作为参数

看文档:需求2:我要验证前端传过来的属性名和实体一样,列名虽然防注入,但是还是可以任意传,对于高安全级别项目加个验证更保险 

https://www.donet5.com/Home/Doc?typeId=1202 

5、类型转换

比如PGSQL不支持字符串参数与INT类型相等,我们可以使用类型转换

//SqlSugar自带的类型转换
new ConditionalModel() { 
                FieldName = "id", 
                ConditionalType = ConditionalType.Equal, 
                FieldValue = "1",
                FieldValueConvertFunc=it=>SqlSugar.UtilMethods.ChangeType2(it,typeof(int)) 
//自个实现类型转换                       
new ConditionalModel()  { 
                FieldName = "id", 
                ConditionalType = ConditionalType.Equal, 
                FieldValue = "1",
                FieldValueConvertFunc=it=>Convert.ToInt32(it)) 

6、多表查询去别名 

List<IConditionalModel> conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel{ FieldName = "id", ConditionalType = ConditionalType.Equal,FieldValue="1"});
 var list=db.Queryable<Order>()
          .LeftJoin<Custom>   ((o,i) => o.CustomId == cus.Id)
          .LeftJoin<OrderDetail> ((o,i,c) => o.Id == oritem.OrderId)
          .Select((o,i,c)=> new ViewOrder{ Id=o.Id CustomName=c.Name }) // 是一个新类 
          .MergeTable()//通过MergeTable处理下面的查询就不需要加上 (o,i,c) 的别名限制了  
          .Where(conModels)//因为Select通过Mergetable变成了一个新表,也就是说新表只有 id和CustomName 
          .ToList(); 

7、未来计划

未来会打算支持 Sql函数,真正做到所有的查询条件都能用  

 安装: Nuget SqlSugarCore

 源码: https://github.com/donet5/SqlSugar