1、当ORM自带的Sqlfunc不能满足你的情况下
2、相当复杂的函数
说明:这种方式扩展麻烦些,但是在多库兼容和后期维护会很方便
该方法可以让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
注意:SqlFunc.MappingColumn(sql)该函数是SQL方式传入,如果前端传入一定要处理防止注入
这种方式使用方便,但是缺点在多库支持上不能得到保证
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)
2016 © donet5.comApache Licence 2.0