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