查询函数

用法如下:

db.Queryable<Student>().Where(it => SqlFunc.ToLower(it.Name) == SqlFunc.ToLower("JACK")).ToList();


注意:拉姆达解析支持的原生函数有限

.ToString

.Contains 

.Length

.ToLower

.ToUpper

.ToSubstring 

.Equals

.HasValue

.Replace

.EndsWith

.StartsWith

.Trim

.HasValue

.Value

和常用的Convert.ToInt32等


如果不满足需求请使用SqlFunc这个类,为我们提供了大量函数


SqlFunc函数:


三元判段 ,相当于 it.id==1?1:2

SqlFunc.IIF(it.Id == 1, 1, 2)


if else 4.6.0.1

 SqlFunc.IF(st.Id > 1)
     .Return(st.Id)
     .ElseIF(st.Id == 1)
     .Return(st.SchoolId).End(st.Id)


IsNulll4.6.0.1

SqlFunc.IsNull(it.Id, 0)//如果是null则是0


获取数据库时间4.6.0.1

SqlFunc.GetDate();


判段是NULL或者空

SqlFunc.IsNullOrEmpty(object thisValue)


判段不是NULL并且不是空

SqlFunc.HasValue(object thisValue)


判段大于0并且不等于NULL

SqlFunc.HasNumber(object thisValue)


转小写

SqlFunc.ToLower(object thisValue)

 

转大写

SqlFunc.ToUpper(object thisValue)


去前后空格

SqlFunc.Trim(object thisValue)



模糊查询 like %@p%

SqlFunc.Contains(string thisValue, string parameterValue)

也可以使用 .Where(it=>it.Name.Contains("a"));



In操作  thisValue={1,2,3} 生成的Sql就是 paramterValie in (1,2,3)

SqlFunc.ContainsArray(object[] thisValue, string parameterValue)

也可以使用   .Where(it=>数组变量.Contains(it.Id));  

Not In 操作

.Where(it=>!Array.Contains(it.Id));



模糊查询 like @p%

SqlFunc.StartsWith(object thisValue, string parameterValue)



模糊查询 like %@p

SqlFunc.EndsWith(object thisValue, string parameterValue)



等于

SqlFunc.Equals(object thisValue, object parameterValue)



是否是同一天

SqlFunc.DateIsSame(DateTime date1, DateTime date2)



是否是同一时间 (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)


获取当前时间的年、月、天、小时、分钟、秒或者毫秒

SqlFunc.DateValue(DateTime date, DateType dataType)


范围判段

SqlFunc.Between(object value, object start, object end)


类型转换

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.Substring(object value, int index, int length)


替换字符串

SqlFunc.Replace(object value, string oldChar, string newChar)


获取字符串长度

SqlFunc.Length(object value)


聚合函数

SqlFunc.AggregateSum<TResult>(TResult thisValue) 
SqlFunc.AggregateAvg<TResult>(TResult thisValue)
SqlFunc.AggregateMin(TResult thisValue) 
SqlFunc.AggregateMax<TResult>(TResult thisValue) 
SqlFunc.AggregateCount<TResult>(TResult thisValue)


如果还不支持可以用 MappingColumn 实现复杂的功能

 var s2 = db.Queryable<Student>()
 .Select(it => new { id = it.Id, rowIndex=SqlFunc.MappingColumn(it.Id, " row_number() over(order by id)") }).ToList();
 //生成SQL
 //SELECT  [ID] AS [id] , row_number() over(order by id) AS [rowIndex]  FROM [STudent]



如果还有不支持的可以写字符串

db.Queryable<Student>().Where("id=@id",new{id=1}).Select("id,name").ToList()


如果还不支持可以下面的自定义扩展SqlFunc让你的代码更漂亮

让拉姆达支持我自定义的方法(4.6.0.6)

    public class Demo
    {
        public static SqlSugarClient GetDb()
        {
            //Create ext method
            var expMethods = new List<SqlFuncExternal>();
            expMethods.Add(new SqlFuncExternal()
            {
                UniqueMethodName = "MyToString",
                MethodValue = (expInfo, dbType, expContext) =>
                {
                    if(dbtype=DbType.SqlServer)
                     return string.Format("CAST({0} AS VARCHAR(MAX))", expInfo.Args[0].MemberName);
                    else
                     throw new Exception("未实现")'
                }
            });

            var config = new ConnectionConfig()
            {
                ConnectionString = Config.ConnectionString,
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                ConfigureExternalServices = new ConfigureExternalServices()
                {
                    SqlFuncServices = expMethods//set ext method
                }
            };

            SqlSugarClient db = new SqlSugarClient(config);
            return db;
        }

        public static string MyToString<T>(T str)
        {
            throw new NotSupportedException("Can only be used in expressions");
        }

        public static void Init()
        {
            var db = GetDb();
            var list = db.Queryable<Student>().Where(it => MyToString(it.Id) == "1302583").ToList();
            var sql = db.Queryable<Student>().Where(it => MyToString(it.Id) == "1302583").ToSql();
            Console.WriteLine(sql);
        }
    }


收藏到朋友圈: