用法
我們可以使用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-dd it.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.GreaterThan SqlFun.LessThan |
判段是NULL或者空
SqlFunc.IsNullOrEmpty( object thisValue) //可以取反 !SqlFunc.IsNullOrEmpty( object thisValue) |
判段不是NULL
SqlFunc.HasValue( object thisValue) //或者 it.xx!= null // xx is not null it.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 的參數)
//用例:1 SqlFunc.EqualsNull(it.Name, null ) //SQL: it.Name is null //用例:2 SqlFunc.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返回false SqlFunc.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(..) |