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

SqlFunc.JsonField(it.JsonObj,"id")
//返回1

(2)多層級查詢,查詢id 的值 {obj:{id:"a"}} 

SqlFunc.JsonField(it.JsonObj,"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數組的索引對象

SqlFunc.JsonIndex(it.JsonArray,0)

如果是['a','c'] 那麼返回a

 

PostgreSQL

MySql 

SqlServer2017

SqlFunc.JsonParse 轉成JSON類型 支持PostgreSQL

 

SqlFunc.JsonContainsFieldName

第一層是否存在id (如果多層級需要結合JsonField)

SqlFunc.JsonField("{id:1}","id")//true
支持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(..)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章