1. [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
  2. public class DbFunAttribute : Attribute
  3. {
  4. public DbFunAttribute( string functionName, Type returnType)
  5. {
  6. ReturnType = returnType;
  7. FunctionName = functionName;
  8. }
  9.  
  10. public DbFunAttribute()
  11. {
  12.  
  13. }
  14.  
  15. public Type ReturnType { get; set; }
  16. public string FunctionName { get; set; }
  17. }
  18.  
  19. public static class SqlFunctionExtension
  20. {
  21. public static ModelBuilder UseSqlFunction(this ModelBuilder modelBuilder)
  22. {
  23. foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
  24. {
  25. foreach (var type in assembly.GetTypes()
  26. .Where(item=>item.GetCustomAttribute<DbFunAttribute>() != null))
  27. {
  28. List<MethodInfo> funList = type.GetMethods(BindingFlags.Public | BindingFlags.Static)
  29. .Where(method => method.GetCustomAttribute<DbFunAttribute>() != null)
  30. .ToList();
  31.  
  32. foreach (var method in funList)
  33. {
  34. modelBuilder.HasDbFunction(method).HasTranslation(arg =>
  35. {
  36. var argumentos = arg.ToList();
  37. var attribute = method.GetCustomAttribute<DbFunAttribute>();
  38. var funcionName = attribute.FunctionName;
  39. return new SqlFunctionExpression(
  40. funcionName,
  41. attribute.ReturnType,
  42. argumentos);
  43. });
  44. }
  45. }
  46. }
  47.  
  48. return modelBuilder;
  49. }
  50. }

调用的Sql方法

  1. [DbFun]
  2. public class Function
  3. {
  4. public static int DateDiff(string part, DateTime inicio, DateTime fim)
  5. => ;
  6.  
  7. [DbFun("REPLACE", typeof(string))]
  8. public static string Replace(object dados, string substituir, string por)
  9. => string.Empty;
  10. }

启用

Ef的DbContext对象下面的

  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. base.OnModelCreating(modelBuilder);
  4.  
  5. modelBuilder.HasDbFunction(typeof(Function).GetMethod("DateDiff")).HasTranslation((arg =>
  6. {
  7. var argumentos = arg.ToList();
  8. argumentos[] = new SqlFragmentExpression((string)((ConstantExpression)argumentos.First()).Value);
  9. return new SqlFunctionExpression(
  10. "DATEDIFF",
  11. typeof(int),
  12. argumentos);
  13. }));
  14.  
  15. modelBuilder.UseSqlFunction();
  16. }

调用

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

Ef Core增加Sql方法的更多相关文章

  1. EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真

    EF Core使用SQL调用返回其他类型的查询   假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...

  2. 【爬坑笔记】c# 如何通过EF Core读写sql server的类似double型字段

    =============================================== 2019/8/31_第1次修改                       ccb_warlock == ...

  3. EF Core使用SQL调用返回其他类型的查询

    假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法是编写 ADO.NET 代码,并从 EF 获取数据库 ...

  4. 第七节:EF Core调用SQL语句和存储过程

    一. 查询类(FromSql) 1.说明 A. SQL查询必须返回实体的所有属性字段. B. 结果集中的列名必须与属性映射到的列名相匹配. C. SQL查询不能包含关联数据 D. 除Select以为的 ...

  5. EF Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  6. EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果,及FromSql方法使用讲解

    EF Core中: 如果调用Queryable.Count等聚合方法,不会导致DbContext跟踪(track)任何实体. 此外调用Queryable.Join方法返回的匿名类型也不会被DbCont ...

  7. NET5 EF Core添加EF生成SQL日志记录

    1.添加NuGet包:Microsoft.Extensions.Logging.Debug 2.添加单独类库用于后期维护:BCode.DataBase.Log 3.添加EFCoreLoggerProv ...

  8. .net core EF Core 视图的应用

    由之前的一篇文章<.net core Entity Framework 与 EF Core>我们都已经知道 EF Core 增加了许多特性,并且性能上也有了很大的提升. 但是EF Core ...

  9. EF Core 2.0 已经支持自动生成父子关系表的实体

    现在我们在SQL Server数据库中有Person表如下: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Cr ...

随机推荐

  1. Linux上运行安卓应用:安装使用Anbox

    文章目录 #0x0 简介 #0x1 安装教程 #0x11 第一步,安装需要的内核模块 #0x12 安装Anbox #0x2 使用Anbox #0x21 一些简单的设置 #0x22 安装APK #0x3 ...

  2. 04 Django模型层: Django-model进阶

    一 QuerySet对象 1.1可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # ...

  3. JVM 专题二十二:垃圾回收(六)垃圾回收器 (三)

    4. GC日志分析 4.1 日志分析 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略. 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志.类似-verbose: gc ...

  4. CMDB03 /今日未采集的资产、资产入库、资产变更记录、资产采集

    CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 目录 CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 1. 获取今日未采集的服务器 2. server资产入库以 ...

  5. Django之模型的_meta属性

    Python有反射机制,Django也不例外,也有很好的反射机制,每个Django模型都有一个属性_meta,_meta也有属性和方法,这些属性和方法反射出了模型的一些特性,如果_meta用的好的话, ...

  6. POJ 1046 Color Me Less 最详细的解题报告

    题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...

  7. java的干儿子锁Lock

    目录 Lock的由来 线程之间的交互 Lock方法简介 lock() lockInterruptibly() trylock() trylock(long,TimeUnit) unlock() new ...

  8. ASP.NET Core静态文件处理源码探究

    前言     静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接 ...

  9. 史上最全SpringBoot整合Mybatis案例

    摘要:如果小编说,SpringBoot是目前为止最好的框架,应该没有人会反驳吧?它的出现使得我们很容易就能搭建一个新应用.那么,SpringBoot与其他第三方框架的整合必定是我们需要关注的重点. 开 ...

  10. 评测Loki日志工具

    评测Loki日志工具 目录 评测Loki日志工具 部署Loki 配置grafana 总结: 优势: 劣势: 本文仅对Loki进行简单评测,不涉及原理和细节. 部署Loki Loki是grafana团队 ...