.NET 多条件动态参数查询方法 - SqlSugar ORM
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的更多相关文章
- dapper利用DynamicParameters构建动态参数查询
public static int GetTotalLogin(string username,DateTime start, DateTime end) { using (var _connecti ...
- mybatis动态参数查询
参考:https://blog.csdn.net/zbw18297786698/article/details/53727594
- 比较爽的导航查询 功能 - SqlSugar ORM
1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用 ...
- Thinkphp回顾之(四)查询方法深入学习
本次讲的查询方法主要有:表达式查询,模糊查询,between语句,in语句,区间查询,统计数据,普通方式查询,但大多数都只是引入数组而已,明白了第一个,其他的也就差不多全明白了,唯一要注意的是在后台中 ...
- input动态模糊查询的实现方式
最近在用jQuery实现动态模糊查询的时候,找了挺久都没有找到像Vue.js的watch属性这么好用的动态模糊查询方法.就分享一下目前遇到的坑和可以实现动态查询的几种方式. 1.jQuery的chan ...
- UGUI OnValueChanged 动态参数指定
在选择方法的时候注意,选择最上面的动态参数的方法.
- javascript:设置URL参数的方法,适合多条件查询
适用场景:多条件查询情况,如下图所示: 通过设置URL参数,再结合数据源控件设置的RUL参数,就能进行简单的多条件查询了. javascript函数: <mce:script type=&quo ...
- LINQ to SQL 运行时动态构建查询条件
在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...
- spring mongodb分页,动态条件、字段查询
使用MongRepository public interface VideoRepository extends MongoRepository<Video, String> { Vid ...
随机推荐
- 洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)
洛谷题面传送门 题解里一堆密密麻麻的 Raney 引理--蒟蒻表示看不懂,因此决定写一篇题解提供一个像我这样的蒟蒻能理解的思路,或者说,理解方式. 首先我们考虑什么样的牌堆顺序符合条件.显然,在摸牌任 ...
- LeeCode刷题笔记
(本来想在LeeCode题目页面上做注释的,结果没找到位置,只好来这里了) 字符串部分: 14.最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀. 示例 1: 输入: ["flow ...
- PHP对称加密-AES加密、DES加密
对称加密 对称加密算法是指,数据发信方将明文(原始数据)和密钥一起经过加密处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若要解读原文,则需要使用加密密钥及相关算法的逆算法对密文进行解密,使 ...
- 68-Binary Tree Postorder Traversal
Binary Tree Postorder Traversal My Submissions QuestionEditorial Solution Total Accepted: 97358 Tota ...
- Go知识点大纲
目录 1. 基本介绍 2. 安装及配置 3. 变量 4. 常量 5. 数据类型 5.1 numeric(数字) 5.2 string(字符串) 5.3 array(数组) 5.4 slice(切片) ...
- Excel-vlookup内部能不能用函数?(即内部嵌套函数)
11.vlookup(查找值,目标区域,列序号,FALSE0/TRUE1)内部能不能用函数?(即内部嵌套函数) 总结:只能说有,但不是所有,目前还没有找到规律(唯一的规律是内嵌函数结果值得是符合vlo ...
- ubuntu终端ls颜色配置
buntu中没有LS_COLORS,/etc/目录中也没有DIR_COLORS,所以这里使用dircolor命令加以解决 1. 利用dircolors命令,查看我们的系统当前的文件名称显示颜色的值,然 ...
- 学习java的第九天
一.今日收获 1.java完全学习手册第二章程序流程控制中的顺序结构与选择结构 2.学习了java中选择的一些语句和关键词 二.今日问题 1.例题验证有错的情况 2.哔哩哔哩教学视频的一些术语不太理解 ...
- accent, access, accident
accent A colon (:) is used to represent a long vowel [元音], e.g. sheet /ʃiːt/ and shit /ʃit/. The wor ...
- flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习
1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...