扩展SqlFunc函数

使用场景

1、当ORM自带的Sqlfunc不能满足你的情况下 

2、相当复杂的函数

扩展方式1:支持多库兼容

说明:这种方式扩展麻烦些,但是在多库兼容和后期维护会很方便

该方法可以让Lambda支持自定义解析, 可以把数据库的自带函数封装起来, 享受一个完美的ORM

当然, 该方法不仅仅只是支持查询里面使用, 对应的查询, 修改, 删除都可以使用自定义Lambda解析, 这里用查询做Demo

    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();
       
            //生成的Sql CAST([Id] AS VARCHAR(MAX))
        }
    }

复制上面的Class直接可以在程序中跑的

共享你们的自定义函数:

1、方便其它人看到

2、方便自已下次用到

共享地址 :  http://www.donet5.com/Ask/9/11063

扩展方式2:快速扩展

注意:SqlFunc.MappingColumn(sql)该函数是SQL方式传入,如果前端传入一定要处理防止注入

这种方式使用方便,但是缺点在多库支持上不能得到保证

5.1.4.64语法更新

 SqlFunc.MappingColumn<int>("Id*1")//新版本
 SqlFunc.MappingColumn(default(int),"Id*1")//老版本

功能介绍

如果你认为上面的方法麻烦,你也可以用SQL实现

//例1:
 Where(it=>it.IDCard==SqlFunc.MappingColumn<string>("Sf_Translate(IdCard, IdType)")//新语法
//生成的Sql如下 
//IDCard=Sf_Translate(IdCard, IdType)

//例2:
.GroupBy(it => SqlFunc.MappingColumn<string>(" CONVERT(varchar(10),t.F_OutTime, 120)"))//新语法
//生成的Sql如下
//CONVERT(varchar(10),t.F_OutTime, 120)

//例3: 部分表达式SQL
var sql=" id>1 ";
Where(it=> SqlFunc.MappingColumn<bool>(sql) || it.Name=="a")//新语法
//生成的Sql如下
// id>1 or name='a'

//例4: 全部SQL
var sql=" id>1 ";
Where(sql)


关闭
果糖网