博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ef Core增加Sql方法
阅读量:5161 次
发布时间:2019-06-13

本文共 3178 字,大约阅读时间需要 10 分钟。

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]    public class DbFunAttribute : Attribute    {        public DbFunAttribute( string functionName, Type returnType)        {            ReturnType = returnType;            FunctionName = functionName;        }        public DbFunAttribute()        {        }        public Type ReturnType { get; set; }        public string FunctionName { get; set; }    }    public static class SqlFunctionExtension    {        public static ModelBuilder UseSqlFunction(this ModelBuilder modelBuilder)        {            foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())            {                foreach (var type in assembly.GetTypes()                .Where(item=>item.GetCustomAttribute
() != null)) { List
funList = type.GetMethods(BindingFlags.Public | BindingFlags.Static) .Where(method => method.GetCustomAttribute
() != null) .ToList(); foreach (var method in funList) { modelBuilder.HasDbFunction(method).HasTranslation(arg => { var argumentos = arg.ToList(); var attribute = method.GetCustomAttribute
(); var funcionName = attribute.FunctionName; return new SqlFunctionExpression( funcionName, attribute.ReturnType, argumentos); }); } } } return modelBuilder; } }

调用的Sql方法

[DbFun]    public class Function    {        public static int DateDiff(string part, DateTime inicio, DateTime fim)            => 0;        [DbFun("REPLACE", typeof(string))]        public static string Replace(object dados, string substituir, string por)            => string.Empty;    }

 

启用

Ef的DbContext对象下面的

protected override void OnModelCreating(ModelBuilder modelBuilder)        {            base.OnModelCreating(modelBuilder);            modelBuilder.HasDbFunction(typeof(Function).GetMethod("DateDiff")).HasTranslation((arg =>            {                var argumentos = arg.ToList();                argumentos[0] = new SqlFragmentExpression((string)((ConstantExpression)argumentos.First()).Value);                return new SqlFunctionExpression(                    "DATEDIFF",                    typeof(int),                    argumentos);            }));            modelBuilder.UseSqlFunction();}

调用

var serviceProvider = services.BuildServiceProvider();            var context = serviceProvider.GetService(typeof(CoreWebContext)) as CoreWebContext;            var query = context.EntityOrder.Where(item => Function.DateDiff("MONTH", DateTime.Parse("2018-06-01"), item.PayTime.Value) == 0).Select(item =>                Function.Replace(item.OrderNo, "2018", "xyzx")            );            var list = query.ToList();

 

转载于:https://www.cnblogs.com/NCoreCoder/p/9172143.html

你可能感兴趣的文章
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
(一一二)图文混排中特殊文字的点击与事件处理
查看>>
iPhone开发经典语录集锦 (转)
查看>>
SVM基础必备常识
查看>>
FPGA时序约束的几种方法 (转)
查看>>
cocos2dx 3.x tolua 分析
查看>>
oracle 外网访问
查看>>
jdbc连接数据库方式问题
查看>>
一步一回头撞在了南墙上
查看>>
POJ2965 The Pilots Brothers' refrigerator
查看>>
C# 2.0 中的新增功能01 分布类与分部方法
查看>>
关于腾讯ip接口一个流传很广的错误用法
查看>>