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  7 Not 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

InLike 15

正确格式   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 oneClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
JoinType.Left, o.Id == i.OrderId,
JoinType.Left, o.CustomId == c.Id
))
.Select((o,i,c)=> new ViewOrder// 是一个新类
{ Id=o.Id
CustomName=c.Name
})
.MergeTable()//通过MergeTable处理下面的查询就不需要加上 (o,i,c) 的别名限制了
.Where(conModels) //因为Select通过Mergetable变成了一个新表,也就是说新表只有 id和CustomName
.ToList();

  

安装: Nuget SqlSugarCore

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

.NET 多条件动态参数查询方法 - SqlSugar ORM的更多相关文章

  1. dapper利用DynamicParameters构建动态参数查询

    public static int GetTotalLogin(string username,DateTime start, DateTime end) { using (var _connecti ...

  2. mybatis动态参数查询

    参考:https://blog.csdn.net/zbw18297786698/article/details/53727594

  3. 比较爽的导航查询 功能 - SqlSugar ORM

    1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用 ...

  4. Thinkphp回顾之(四)查询方法深入学习

    本次讲的查询方法主要有:表达式查询,模糊查询,between语句,in语句,区间查询,统计数据,普通方式查询,但大多数都只是引入数组而已,明白了第一个,其他的也就差不多全明白了,唯一要注意的是在后台中 ...

  5. input动态模糊查询的实现方式

    最近在用jQuery实现动态模糊查询的时候,找了挺久都没有找到像Vue.js的watch属性这么好用的动态模糊查询方法.就分享一下目前遇到的坑和可以实现动态查询的几种方式. 1.jQuery的chan ...

  6. UGUI OnValueChanged 动态参数指定

    在选择方法的时候注意,选择最上面的动态参数的方法.

  7. javascript:设置URL参数的方法,适合多条件查询

    适用场景:多条件查询情况,如下图所示: 通过设置URL参数,再结合数据源控件设置的RUL参数,就能进行简单的多条件查询了. javascript函数: <mce:script type=&quo ...

  8. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

  9. spring mongodb分页,动态条件、字段查询

    使用MongRepository public interface VideoRepository extends MongoRepository<Video, String> { Vid ...

随机推荐

  1. MetaboAnalyst的多组学分析

    MetaboAnalyst是做代谢的R包,功能十分强大.也开发了web版本,代谢组学的分析这里不介绍,主要讲讲它开发的多组学分析的相关内容. 既然是做代谢的工具,即使是增加了多组学内容,肯定也是以代谢 ...

  2. 计算机网络-4-7-内部网关协议OSPF

    内部网关协议OSPF(开放最短路径优先) 出现的原因:为了克服RIP协议的缺点在1989年开发出来,**开放 表明OSPF协议不受任何厂家的限制.最短路径优先是因为使用了最短路径算法SPF**. OS ...

  3. 使用Postman轻松实现接口数据关联

    Postman Postman是一款非常流行的HTTP(s)接口测试工具,入门简单,界面美观,功能强大.作为一个测试/开发工程师,这是一款必须要会用的工具.今天以一个实际的案例,来介绍下Postman ...

  4. tomcat在eclipse上发布,Perference下的server找不到解决办法

    help--->Install New software得到如下所示 下面work with选项的内容与你的eclipse版本有关 我的eclipse版本为eclipse-java-2019-0 ...

  5. JavaScript设计模式,单例模式!

    单例设计模式:保证一个类仅有一个实例,并且提供一个访问它的全局访问点.有些对象只需要一个,这时可用单例模式. 传统的单例模式 和new 创建对象的调用不一样 调用者要调用xxx.getInstance ...

  6. JPA和事务管理

    JPA和事务管理 很重要的一点是JPA本身并不提供任何类型的声明式事务管理.如果在依赖注入容器之外使用JPA,事务处理必须由开发人员编程实现. 123456789101112UserTransacti ...

  7. Equinox OSGi服务器应用程序的配置步骤 (支持JSP页面)

    本文介绍在Eclipse里如何配置一个简单的基于Eclipse Equinox OSGi实现的Web应用程序,在它的基础上可以构造更加复杂的应用,本文使用的是Eclipse 3.3.1版本,如果你的E ...

  8. linux环境下安装jdk,tomcat

    一.安装tomcat 1.使用docker安装(你得linux服务器上已经安装了docker) 1)执行命令: docker search tomcat; 2)选择第一个镜像进行下载,执行命令:doc ...

  9. 结合redis缓存的方式,查询和展示分类信息

    package cn.itcast.travel.service.impl;import cn.itcast.travel.dao.CategoryDao;import cn.itcast.trave ...

  10. Jenkins获取发版人的人名

    目录 一.简介 二.自由风格使用 三.pipeline使用 脚本式 声明式 一.简介 Jenkins在构建记录中,是可以看到谁点的构建的,但pipeline中的全局变量,默认是不支持获取当前构建任务的 ...