。NET通用多条件动态参数查询方法
通用查询用途
一般我们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(); 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().Where(conModels).ToList(); //select * from Student where id=1 and name = "jack"
这种比较简单 多一条记录就多一个AND2、二级多条件动态参数
这种模式对于表格查询已经够用了,支持到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().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().Where(conditionalModels).ToList();
更多用例:https://www.donet5.com/Ask/9/143783、操作符解释
ConditionalTypek是一个枚举
枚举
枚举值
描述
Equal
0
等于
Like
1
模糊查询
GreaterThan
2
大于
GreaterThanOrEqual
3
大于等于
LessThan
4
小于
LessThanOrEqual
5
小于等于
In
6In操作
正确格式 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(r.FieldName );//这样就支持了用实体类中的属性作为参数 }
看文档:需求2:我要验证前端传过来的属性名和实体一样,列名虽然防注入,但是还是可以任意传,对于高安全级别项目加个验证更保险
https://www.donet5.com/Home/Doc?typeId=12025、类型转换
比如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 conModels = new List(); conModels.Add(new ConditionalModel{ FieldName = "id", ConditionalType = ConditionalType.Equal,FieldValue="1"}); //查询 var list=db.Queryable() .LeftJoin ((o,i) => o.CustomId == cus.Id) .LeftJoin ((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
喜欢的朋友点一下关注 点关注不迷路
从五年IOS果粉转红米K40por三个月真实使用感受原来一直用6SP,老婆用苹果X,以前对安卓的感觉很差,内心挣扎了很久才才下决心转安卓阵营的,平时就玩玩吃鸡,说说刚转过来的感受优点1,120HZ太流畅了,爽2,33W充电很快3,小
OLED屏的普及之作,小米电视6OLED测评目前家用电视机屏幕主要有两种类型,一种是液晶,一种是OLED。液晶技术很成熟,应用也非常广泛,具有寿命长,效果好,相对环保和省电的优势,最重要的是,液晶屏更便宜。而OLED算是新技
阿里巴巴员工总数超25万,为什么只有6000人发起倡议?不在沉默中爆发,就在沉默中死亡!据报道,阿里员工组建了员工帮助的讨论群,已有6000多名阿里员工加入了这个群。这6000多人发布了关于员工性侵事件的联合倡议。倡议认为,这个事件显示
阿里女员工被侵犯案反思人事部门理性多了,感性少了?民法典生效已经8月有余了,阿里竟然才想起制定反性骚扰行动准则开通专门负责部门,多少让民法典尴尬了。8月9日凌晨,阿里巴巴董事会主席兼CEO张勇在阿里内网公布了女员工被侵犯的阶段性内
被神化已久的阿里,必须经得起舆论批评,它早该走下神坛文远见陈这几日关于阿里巴巴内部出现的事件,沸腾不止,我们终于看到了一个不一样的阿里。什么阿里?一个被过度神化的民营企业。我一直认为阿里的崛起,是吃了国家发展的红利期,它是线上卖货的
五大天价电子产品!手表2。5亿,电视1500万,网友格局打开了作为普通消费者,我们在购物时往往追求性价比,所以类似小米这样的品牌十分有市场。当然,性价比是一个相对论,很多出色的数码产品价格不菲,但也贵的有道理。比如做工极为精致甚至全手工打造使
微信又更新了!网友直呼真香啊你发现了吗?微信又悄悄更新了!这次都有哪些新功能呢?快跟小编一起来了解下这两天,微信表情都戴医用口罩了登上热搜,引发网友广泛关注。赶快查看下自己手机微信,是不是发现生病这个表情确实
雷军,意外投了一个足浴机器人只有你想不到,没有雷军投不到消费型机器人开始走进千家万户。作者I张继文刘福娟报道I投资界PEdaily这是一笔低调到几乎被遗漏的投资。起源是一则工商变更投资界从天眼查APP获悉,佛
Java输了?8月编程排行榜新鲜出炉8月最新的编程语言榜单发布了,本月榜单中Python成功超越Java。如今,数据挖掘和人工智能这一领域的编程语言正在逐渐崛起。Python不仅成功挤入前三并有望冲击第一,更是获得了
封号潮令数十亿库存滞留,大卖挥泪低价清仓从4月开始,亚马逊掀起一场旷日持久的封号潮,数万卖家受影响。行业巨震之下,库存问题已成为卖家们面临的最大死敌。一旦库存高企,跨境企业就像推倒了的多米诺骨牌,资金链承压营收下降供应商
取消大小周后,年轻人为什么又不干了?自腾讯旗下光子工作室调整为强制6点下班后,互联网大厂接连送上减负大礼包。字节跳动快手美团优选先后取消大小周制度,一时间有关反内卷胜利终结加班文化的欢呼声不绝于网络。然而,大厂打工人