SqlSugar的查询函数SqlFunc
用法
我们可以使用SqlFunc这个类调用Sql函数,用法如下:
db.Queryable<Student>().Where(it => SqlFunc.ToLower(it.Name) == SqlFunc.ToLower("JACK")).ToList(); |
C#函数
支持一些常用的C#函数
. ToString .Contains .Length.ToLower .ToUpper .ToSubstring
.Equals .HasValue .Replace .EndsWith .StartsWith .Trim
.HasValue .Value .AddDays(AddHours等) 和 常用的 Convert.ToInt32 等
三元 xx??0 时间.DayOfWeek 时间.Date 时间.Day等 (时间-时间).TotalDays
逻辑函数
三元判段 ,相当于 it.id==1?1:2
SqlFunc.IIF(it.Id == 1, 1, 2) |
case when
SqlFunc.IF(st.Id > 1) .Return(st.Id) .ElseIF(st.Id == 1) .Return(st.SchoolId).End(st.Id) //注意:End因为泛型原因没办传null,如果需要传null这么写.End<int>();//等于同 case when |
IsNulll4.6.0.1
SqlFunc.IsNull(it.Id, 0)//如果是null则是0//it.Id??0//如果是等于处理NULL看下面的 EqualsNull//ifnull |
时间函数
时间格式化
请升级到5.0.51+,更好的支持了时间格式化
//都支持常用yyyy-MM-ddit.CreateTime.ToString("yyyy-MM-dd")//1、SqlServer 2012及以上 用SQL查看版本 :select @@version //5.0.6+ ToString完美支持了所有 yyyy mmm ddd这种格式 //SqlServer2012以下 // 5.0.6+ 只支持( yyyy-MM-dd 、yyyy-MM 和 yyyy-MM-dd hh:mm:ss ) 3种格式 // ToString("23") 带数字写法生成convert( varchar(20) ,时间, 23)//2、MySql和Sqlite //支持 yyyy-MM-dd 、 yyyy-MM 和 yyyy-MM-dd hh:mm:ss//可以使用原生转换: it.CreateTime.ToString("%Y-%m")//只要有%号就会进入原生转换//https://www.cnblogs.com/shuilangyizu/p/8036620.html对照表//3、PgSql和Oracle 完美支持所有C# yyyy mmm ddd 格式转换 |
获取数据库时间4.6.0.1
SqlFunc.GetDate(); //数据库服务器时间 注意 :Sqlfunc方法只能用在表达式中,如果非表达式中用 db.GetDate() |
是否是同一天
SqlFunc.DateIsSame(DateTime date1, DateTime date2)//例子:查询今天 今日 当天SqlFunc.DateIsSame(it.CreateTime,DateTime.Now) |
是否是同一月
it.CreateTime.ToString("yyyy-MM")==DateTime.Now.ToString("yyyy-MM") //日期格式化 |
是否是同一年
it.CreateTime.Year==DateTime.Now.Year |
是否是同一时间 (dataType 可以是年、月、天、小时、分钟、秒和毫秒)
SqlFunc.DateIsSame(DateTime date1, DateTime date2, DateType dataType)//本月 本年 本天 都可以用这个函数 |
在当前时间加一定时间(dataType 可以是年、月、天、小时、分钟、秒和毫秒)
SqlFunc.DateAdd(DateTime date, int addValue, DateType dataType) |
在当前时间加N天
SqlFunc.DateAdd(DateTime date, int addValue)//也可以用it.CreateTime.AddDasy(1) |
获取当前时间的年、月、天、小时、分钟、秒或者毫秒
SqlFunc.DateValue(DateTime date, DateType dataType)//也可以用it.CreateTime.Day |
DateDiff 计算时间差( 已知MSSQL支持)
SqlFunc.DateDiff(type,DateTime.Now,DateTime.Now.AddDays(1)) //结果等于1 ,相差1天,小的时间在前面,大的时间在后面 //生成的SQL DATEDIFF(day,@MethodConst1, (DATEADD(Day,@MethodConst4,@MethodConst3)) ) //也可以 (时间-时间).TotalDays |
周数、周几
//周几 SqlFunc.DateValue(DateTime.Now, DateType.Weekday); //一年中第几周 SqlFunc.WeekOfYear |
聚合函数
SqlFunc.AggregateSum<TResult>(TResult thisValue) //求和SqlFunc.AggregateSumNoNull<TResult>(TResult thisValue) //求和(新 支持过滤null)SqlFunc.AggregateAvg<TResult>(TResult thisValue)//平均值SqlFunc.AggregateMin(TResult thisValue) //最小SqlFunc.AggregateMax<TResult>(TResult thisValue) //最大SqlFunc.AggregateCount<TResult>(TResult thisValue)//统计数量SqlFunc.AggregateDistinctCount<TResult>(TResult thisValue) //去重统计数量 |
格式转换截取替换等
不包含时间转换,时间转换看标题【时间函数】
四舍五入 精度 (5.0.4)
SqlFunc.Round(it.Price,2) //两位小数 |
绝对值函数 (5.0.4)
SqlFunc.Abs(it.Price) |
截取字符串
SqlFunc.Substring(object value, int index, int length)//字符串截取 |
替换字符串
SqlFunc.Replace(object value, string oldChar, string newChar) |
转小写
SqlFunc.ToLower(object thisValue) |
转大写
SqlFunc.ToUpper(object thisValue) |
去前后空格
SqlFunc.Trim(object thisValue) |
类型转换
SqlFunc.ToInt32(object value) SqlFunc.ToInt64(object value)SqlFunc.ToDate(object value) SqlFunc.ToString(object value) SqlFunc.ToDecimal(object value) SqlFunc.ToGuid(object value) SqlFunc.ToDouble(object value) SqlFunc.ToBool(object value) |
指定位置替换
SqlFunc.Stuff(string sourceString, int start, int length, string AddString) |
BOOL返回值函数
字符串比大小,字符串比较,字符串对比
(int)(object)it.str1>(int)(object)str2//生成的sql//it.str1>@str2//或者用函数 较高版本支持SqlFunc.GreaterThanSqlFun.LessThan |
判段是NULL或者空
SqlFunc.IsNullOrEmpty(object thisValue)//可以取反!SqlFunc.IsNullOrEmpty(object thisValue) |
判段不是NULL
SqlFunc.HasValue(object thisValue)//或者it.xx!=null // xx is not nullit.xx==null //xx is null |
按位与 按位或
SqlFunc.BitwiseAnd &SqlFunc.BitwiseInclusiveOR | |
判段大于0并且不等于NULL
SqlFunc.HasNumber(object thisValue) |
模糊查询 like %@p%
SqlFunc.Contains(string thisValue, string parameterValue) |
也可以使用 .Where(it=>it.Name.Contains("a"));
模糊查询 not like %@p%
!SqlFunc.Contains(string thisValue, string parameterValue) //前面加个! |
In单列操作
thisValue=new string[]{1,2,3}
paramterValie =it.Id
生成的Sql就是 id in (1,2,3)
//非参数化in 支持数量无上限SqlFunc.ContainsArray(object[] thisValue, string parameterValue)//参数化in ,特殊类型适合用这个兼容性好SqlFunc.ContainsArrayUseSqlParameters(object[] thisValue, string parameterValue)//原生方法语法糖: .Where(it=>数组变量.Contains(it.Id)); // in .Where(it=>!Array.Contains(it.Id));// not in //字符串类型 varchar和nvarchar (默认varchar来保证性能) NameList.Contains(it.Name,true) //true和false来控制是varchar还是nvarchar |
In多列操作 51.4.67-preview04
Where(it => list.Any(s => s.Id == it.Id && s.Name == it.Name)) |
模糊查询 like @p%
SqlFunc.StartsWith(object thisValue, string parameterValue) //查询字符串开头 |
模糊查询 like %@p
SqlFunc.EndsWith(object thisValue, string parameterValue) |
等于
SqlFunc.Equals(object thisValue, object parameterValue) |
等于(支持 is null 的参数)
//用例:1SqlFunc.EqualsNull(it.Name,null) //SQL: it.Name is null//用例:2SqlFunc.EqualsNull(it.Name,"a") //SQL: it.Name='a' |
范围判段
SqlFunc.Between(object value, object start, object end) |
字符串逗号分割后是否存在提定的值 (5.1.3.51-preview01)
SqlFunc.SplitIn("1,2,3,4","5") //不存在5返回falseSqlFunc.SplitIn("1,2,3,4","1") //存在1返回true//相关功能://如果是合并用子查询//Names=SqlFunc.Subqueryable<Order>().Where(z=>z.Id==it.Id).SelectStringJoin(z => z.Name, ",") |
子查询( IN、Exists、列逗号拼接 )
文档:https://www.donet5.com/Home/Doc?typeId=2231
导航函数
一对多和多对多
需要实体配置导航
注意:不需要 .Includes 就能使用导航函数
//Count可以用到Where或者Select中//x.导航对象.Count()//返回导航数量//x.导航对象.Count(z=>z.id==1) //可以加条件Where(x=>x.books.Count()>1)Select(it=>new { count =>x.books.Count()})//5.0.9.8-preview01支持了在Select中用Count//Any //x.导航对象.Any()//是否存在//x.导航对象.Any(z=>z.id==1) //可以加条件Where(x=>x.books.Any()) |
一对一
需要实体配置导航
//注意:不需 Includes 就可以使用Where(x=>SqlFunc.Exists(x.SchoolA.Id))//查询存在一对一的主表数据Where(x=>SqlFunc.Exists(x.SchoolA.Id,List<IConditionalModel>))//查询存在一对一的主表数据 |
开窗函数
5.1.1版本支持,也要数据库支持
count = SqlFunc.RowCount(),// count (1) over() max= SqlFunc.RowMax(it.num),// max(num) over() min= SqlFunc.RowMin(it.num),// min(num) over() avg= SqlFunc.RowAvg(it.num),// avg(num) over() index = SqlFunc.RowNumber(it.Id), // row_number() over( order by a.`Id`) index = SqlFunc.RowNumber(it.Id,it.Name)// row_number() over( partition by name order by a.`Id`) //倒序用法 index = SqlFunc.RowNumber(SqlFunc.Desc(it.Id)) //DESC //多字段 5.1.2-preview01 一定要升级 index = SqlFunc.RowNumber($"{it.Id} asc ,{it.Name} desc "); //如果要用到Where中一般要结合MegerTable进行使用,用例如下 Select(it=>new { index=SqlFunc.RowNumber(it.Id), name=it.name }) .MergeTable() .Where(it=>it.Index=1).ToList() |
JSON函数/数组函数
需要升级到 5.1.2.8+
支持JObject JArray ,实体 ,集合等类型
[SugarColumn(IsJson=true)]//添加特性public List<Order> JsonObj{get;set;} |
| 函数名 | 说明 | 兼容 | ||
|
SqlFunc.JsonLike |
模糊查询,兼容所有库,性能一般适合小数据处理 SqlFunc.JsonLike(it.JsonObj,"a") 等于Like '%a%' |
支持所有数据库 | ||
|
SqlFunc.JsonField |
注意:大小写要一样 (1)查询Id的值{id:1}
(2)多层级查询,查询id 的值 {obj:{id:"a"}}
|
支持 PostgreSQL SqlSugar 5.1.2.23: 支持 SqlServer2017 支持 MySql (只支持字段) SqlSugar 5.1.4.62: 支持 Oracle (只支持字段) |
||
|
SqlFunc.JsonIndex 需要升级到:5.1.4.113-preview2+ |
获取json数组的索引对象
如果是['a','c'] 那么返回a |
PostgreSQL MySql SqlServer2017 |
||
| SqlFunc.JsonParse | 转成JSON类型 | 支持PostgreSQL | ||
|
SqlFunc.JsonContainsFieldName |
第一层是否存在id (如果多层级需要结合JsonField)
|
支持PostgreSQL | ||
|
SqlFunc.JsonArrayAny(it.Json, "a") 需要升级到:5.1.3.36 |
["a","b","c"] 这种数组里面是否存在字符串 a 注意:如果是数字可以 1或者"1" 都试一下 也就是 [1,2] 参数用int类型 也就是 ["1","2"] 参数用string类型 |
支持PostgreSQL 支持MySql 支持SqlServer(最新版本) |
||
|
SqlFunc.JsonListObjectAny(it.json, "Name", "a") 需要升级到:5.1.3.36 |
[{"name":"a"},{"name":"b"}] 集合中是否存在 name=a的一项 注意:数字和字符串差异 |
支持PostgreSQL 支持MySql 支持SqlServer(最新版本) |
||
| SqlFunc.JsonArrayLength(it.Json) | [1,2,3]获取数组长度 |
支持PostgreSQL SqlSugar 5.1.4.115 支持MySql 支持 SqlServer |
其他函数
字符串相加函数
除了SqlServer外很多库对+不友好可以使用
SqlFunc.MergeString//字符串拼接 字段拼接//MYSQL会生成 (concat(@MethodConst0,`Name`) |
随机数函数
SqlFunc.GetRandom |
获取字符串长度
SqlFunc.Length(object value) |
获取指定字符在字符串中的位置
SqlFunc.CharIndex // SQL :(CHARINDEX ([Name],@MethodConst0) |
函数中用SQL
var s2 = db.Queryable<Student>() .Select(it => new { id = it.Id, rowIndex=SqlFunc.MappingColumn(default(int), " row_number() over(order by id)") }).ToList(); //SELECT [ID] AS [id] , row_number() over(order by id) AS [rowIndex] FROM [STudent] //rowIndex= 变成了 AS [rowIndex] //SqlFunc.MappingColumn(it.Id, " row_number() over(order by id)") 变成了 row_number() over(order by id) |
如果还有不支持的可以写字符串
db.Queryable<Student>().Where("id=@id",new{id=1}).Select("id,name").ToList() |
补全PadLeft
SqlFunc.PadLeft(..) |
向上取整和向下取整
SqlFunc.Floor(..)SqlFunc.Ceil(..) |
SqlSugar的查询函数SqlFunc的更多相关文章
- (转)WordPress的主查询函数-query_posts()
今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...
- Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数 关于处理小数点位数的几个oracle函数()1. 取四舍五入的几位小数select round(1.2345, 3) fr ...
- Entity framework 中Where、First、Count等查询函数使用时要注意
在.Net开发中,Entity framework是微软ORM架构的最佳官方工具.我们可以使用Lambda表达式在Entity framework中DbSet<T>类上直接做查询(比如使用 ...
- 说说WordPress的主查询函数-query_posts()
今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...
- C#基础:LINQ 查询函数整理
1.LINQ 函数 1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...
- MySql的FIND_IN_SET()查询函数的使用
表 table的结构如下: id title 1 12,21 2 21,32 3 45,21,78 4 221,45,74 5 34,421,121 6 52,21,321 现在用sql语句查出来字段 ...
- SqlSugar常用查询实例-拉姆达表达式
SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表 SqlSugarClient db = SugarContext.GetInstance( ...
- mysql json 使用 类型 查询 函数
一,对记录的操作 1.创建有json字段的表 -- 创建表 ) , info JSON); 2.插入记录 -- 插入含有json数组的记录 , , "abc", NULL, TRU ...
- Hive(8)-常用查询函数
一. 空字段赋值 1. 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value).它的功能是如果value为NULL,则NVL函数返回default_v ...
- oracle 查询 函数练习2
/*以下代码是对emp表/dept表/salgrade表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr ...
随机推荐
- VS IIS Express 启动项目后,绑IP让别人可以访问你的网站
如何VS IIS Express 启动项目后,绑本机IP,让别人可以访问你的网站,方便Debug 一.修改iis配置 1.在web服务器执行后,会运行IIS Express,右击它选择显示所有应用程序 ...
- ubuntu下完全卸载重装docker教程
操作需在管理员权限下运行 卸载docker 1.删除docker的所有包 apt-get autoremove docker docker-ce docker-engine docker.io con ...
- vivo 云服务海量数据存储架构演进与实践
一.写在开头 vivo 云服务提供给用户备份手机上的联系人.短信.便签.书签等数据的能力,底层存储采用 MySQL 数据库进行数据存储. 随着 vivo 云服务业务发展,云服务用户量增长迅速,存储在云 ...
- @Constraint注解,做特殊的入参校验
// @Constraint 是 Java 中的注解之一,用于标记自定义的约束注解.约束注解通常用于数据验证,用来限制字段的取值或格式,确保数据的合法性. @Constraint(validatedB ...
- 版本升级 | v1.0.13发布,传下去:更好用了
新发行版来啦~ 本次更新主要聚焦兼容性的提升及结果报告格式的增加,另外对部分解析逻辑及使用体验进行了优化.在这里特别鸣谢大佬@Hugo-X在社区仓库提交的PR~ 后续,OpenSCA项目组会继续致力于 ...
- vscode报错Already included file name ‘xxx‘ differs from file name ‘xxx‘ only in casing的解决方法:
场景:我们创建了一个文件是小写开头的,又改成大写开头的. 比如: relationDemo.vue 改成 RelationDemo.vue 原因:缓存的判重逻辑是不区分大小写导致的.在这种情况下,vs ...
- The container name "/nacos" is already in use by container
转载请注明出处: 服务器上使用docker 安装启动 nacos 的时候,报 The container name "/nacos" is already in use by co ...
- Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
本文为博主原创,未经允许不得转载: 1. Jstack 用来查看 java 指定进程所包含的 java 线程状态: "arthas-NettyHttpTelnetBootstrap-3 ...
- 【BAT】递归替换文件后缀
@echo off set /p src_suffix=please input origin suffix: set /p des_suffix=please input target suffix ...
- 监控服务器所有磁盘的inode使用情况
监控服务器所有磁盘的inode使用情况 背景 因为前期数据库开启了审计 但是如果是 DB模式的话 $aud 表的冲突和使用太多了 所以专家建议将审计表放到OS 因为数据库的访问量特别高. 审计的信息又 ...