.NET 通用多条件动态参数查询方法 - SqlSugar ORM


通用查询用途

一般我们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   )  )

C#代码

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 0等于
Like 1模糊查询
GreaterThan 2大于
GreaterThanOrEqual 3大于等于
LessThan 4小于
LessThanOrEqual 5小于等于
In 6

In操作

正确格式   X,Y,Z 

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

NotIn 7Not in操作 参数和in一样
LikeLeft 8左模糊
LikeRight 9右模糊
NoEqual 10不等于
IsNullOrEmpty 11是null或者''
IsNot 12

情况1   value不等于null

字段<> x

情况2   value等于null 

字段 is not null

NoLike 13模糊查询取反
EqualNull 14

情况1   value不等于null

字段= x

情况2   value等于null 

字段 is null

 

InLike15

正确格式   X,Y,Z 

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

生在的Sql :  

 ( id like '%X%' or id like '%Y%' or id like '%Z%')

       

4、列名验证或者转换

需求1:实体和表中字段名称不一样的情况下,我们可以做下面转换

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

引用来源:https://www.cnblogs.com/sunkaixuan/p/15732736.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:使用.NET 6开发TodoList应用(8)——实现全局异常处理
下一篇:12月日常开发小结
评论列表

发表评论

评论内容
昵称:
关联文章

.NET 通用条件动态参数查询方法 - SqlSugar ORM
SqlSugar 5.0官方文档 .NET ORM
.NET SAAS 架构与设计 -SqlSugar ORM
sqlsugar freesql hisql 三个ORM框架性能测试对比
话说C#程序员人手一个ORM
.NET中大型项目开发必备(7)--ORM数据库访问技术
.NET中大型项目开发必备(1)--UUID全球通用唯一识别码
查询参数类:SQLServer
使用.NET 6开发TodoList应用(14)——实现查询过滤
SourceGenerator的应用: .Net进程开发库 - Juxtapose
DBHelper SqlSugar EntityFramework 增删改查 性能对比测试
.NET Core 实现动态代理做AOP(面向切面编程)
使用.NET 6开发TodoList应用(15)——实现查询搜索
SQL Server 查询参数管理类
YES-Win Winform开发框架 自定义查询方法并在表格中展示
.NET Core 利用委托实现动态流程组装
ASP.NET MVC使用@Url.Action 参数中间&被URL编码了
asp.net TagHelper根据条件向元素添加class
windows平台的分布式微服务解决方案(1)--UUID全球通用唯一识别码
.Net Core Razor 预编译,动态编译,混合编译

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码