前言

  一般情况下,使用EF中的语法可以帮助我们完成绝大部分业务,但是也有特殊的情况需要直接执行的Sql语句。比如,我们的业务过于复杂繁琐,或是有些业务使用EF操作时比较复杂,但是使用的Sql时会很简单等,这时就有了以下需求了。

具体实现

  1,首先我们需要定义一个接口类:ISqlExecuter(名字看你心情了)

 1 public interface ISqlExecuter
 2     {
 3         /// <summary>
 4         /// 执行给定的命令
 5         /// </summary>
 6         /// <param name="sql">命令字符串</param>
 7         /// <param name="parameters">要应用于命令字符串的参数</param>
 8         /// <returns>执行命令后由数据库返回的结果</returns>
 9         int Execute(string sql);
10
11         /// <summary>
12         /// 传入查询sql,返回List<T>数组
13         /// </summary>
14         /// <param name="sql"></param>
15         /// <returns></returns>
16         Task<List<T>> SqlQuery<T>(string sql) where T : class, new();
17     }

接口类

  2,定义实现类:SqlExecuter(名字看你心情了)

 1  public class SqlExecuter : ISqlExecuter, ITransientDependency
 2     {
 3         private IDbContextProvider<OADbContext> _dbContextProvider = null;
 4
 5         public SqlExecuter(IDbContextProvider<OADbContext> dbContextProvider)
 6         {
 7             _dbContextProvider = dbContextProvider;//IocManager.Instance.Resolve<IDbContextProvider<OADbContext>>();
 8         }
 9
10         /// <summary>
11         /// 执行给定的命令
12         /// </summary>
13         /// <param name="sql">命令字符串</param>
14         /// <param name="parameters">要应用于命令字符串的参数</param>
15         /// <returns>执行命令后由数据库返回的结果</returns>
16         public int Execute(string sql)
17         {
18             return _dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(new RawSqlString(sql));
19         }
20
21         /// <summary>
22         /// 传入查询sql,返回List<T>数组
23         /// </summary>
24         /// <param name="sql"></param>
25         /// <returns></returns>
26         public async Task<List<T>> SqlQuery<T>(string sql) where T : class, new()
27         {
28             return await Task.Run(() =>
29             {
30                 var db = _dbContextProvider.GetDbContext().Database;
31                 var conn = db.GetDbConnection();
32                 if (conn.State != ConnectionState.Open)
33                     conn.Open();
34
35                 var result = new List<T>();
36
37                 try
38                 {
39                     RelationalDataReader query = null;
40
41                     using (db.GetService<IConcurrencyDetector>().EnterCriticalSection())
42                     {
43                         var rawSqlCommand = db.GetService<IRawSqlCommandBuilder>().Build(sql);
44
45                         query = rawSqlCommand.ExecuteReader(db.GetService<IRelationalConnection>());
46                     }
47
48                     //获取DbDataReader
49                     var dr = query.DbDataReader;
50
51                     var properties = typeof(T).GetProperties().ToList();
52
53                     while (dr.Read())
54                     {
55                         var obj = new T();
56                         foreach (var property in properties)
57                         {
58                             //获取该字段明的列序号,从0开始
59                             var id = dr.GetOrdinal(property.Name.ToLower());
60
61                             if (!dr.IsDBNull(id))
62                             {
63                                 if (dr.GetValue(id) != DBNull.Value)
64                                 {
65                                     property.SetValue(obj, dr.GetValue(id));
66                                 }
67                             }
68                         }
69
70                         result.Add(obj);
71                     }
72
73                     //关闭DbDataReader
74                     dr.Close();
75                 }
76                 catch (Exception e)
77                 {
78                     throw new UserFriendlyException(e.Message);
79                 }
80
81                 return result;
82             });
83         }
84     }

接口实现代码

注意:

  引用ITransientDependency接口是为了ABP的自动注册到容器。

使用方式

  1,注入实例:

  2,调用

转载于:https://www.cnblogs.com/Jinfeng1213/p/11321414.html

ABP实现EF执行SQL(增删改查)解决方案相关推荐

  1. abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之六(三十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  2. EF框架实现增删改查

           EF框架实现增删改查 1.创建数据库:先创建两张表,文章类型表以及文章详情表,设置主外键(ID,Catelogid) Catelog:文章类型表 字段:Id(自增),Name,[Cont ...

  3. 测试开发面经(六)SQL增删改查

    文章目录 测试开发面经(六)SQL增删改查 6. 查询(续) 53).查询未授课教师的姓名和系 54).按职称显示软件学院的教师人数. 55).查询成绩高于<数据结构>平均成绩的学生信息. ...

  4. html编辑ko,BootstrapTable+KnockoutJS相结合实现增删改查解决方案(三)两个Viewmodel搞定增删改查...

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  5. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    JS组件系列--BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查 参考文章: (1)JS组件系列--BootstrapTable+Kno ...

  6. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一)

    JS组件系列--BootstrapTable+KnockoutJS实现增删改查解决方案(一) 参考文章: (1)JS组件系列--BootstrapTable+KnockoutJS实现增删改查解决方案( ...

  7. sql增删改查_增删改查!sql2pandas方法手册

    数据分析 Author:louwill Machine Learning Lab 作为一名数据分析师,利用SQL熟练的取数是一项必备的基础能力.除了SQL以外,Python的pandas也为我们提供了 ...

  8. sql增删改查_快速搞定数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...

  9. sql增删改查_Sirvia 一套web端增删改查系统

    众所周知,后端开发的一个重要组成部分就是数据库,数据的作用简单来说就是将网站的用户数据存起来,至于数据库的什么特性,一些奇技淫巧这里就不便赘述了,因为今天的主角是Sirvia--一套web端增删改查系 ...

  10. sql增删改查_面试速记之数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实.下面是关于 ...

最新文章

  1. C++ 宽字符(wchar_t)与窄字符(char)的转换
  2. java outofmemory jsp_Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结...
  3. 力扣: 268. 丢失的数字
  4. ubuntu各版本代号(更新至15.04)及各版本下载地址等
  5. 微内核和宏内核的区别_8086微处理器中的过程和宏之间的区别
  6. 别急,MIUI 11还有惊喜!下一代MIUI项目已开拔
  7. Python并发编程Futures
  8. 6.12使用tensorflow来搭建一个Transformer
  9. 1032 挖掘技术哪家强
  10. 编程必会的100个代码大全,建议收藏
  11. C语言与线性代数,编程与线性代数
  12. 如何关闭访达窗口_UG NX软件基础操作,如何自定义软件快捷键
  13. 如何在CAD中插入一个自定义对象?
  14. 生信识图 之 点图基础
  15. IE5的兼容问题——记录给自己看的
  16. 企业的五种组织架构模式
  17. 想知道raw转换jpg软件怎么用?教你raw转换的方法
  18. Zigbee应用之搭建开发环境
  19. Swaps in Permutation
  20. 承认多元化,保持宽容

热门文章

  1. linux ip地址本地缓存,ip-address – 如何解析组织的IP地址(使用缓存)
  2. mysql 1539_MySQL:半同步(三)从库端初始化和回调函数
  3. Pytorch基础(一) 初始tensor
  4. 油漆面积 java_第八屆藍橋杯省賽 JavaA組 第十題 標題:油漆面積
  5. java 合并csv_用java将三个csv表格文件,整合数据组合成一个文件。
  6. 手机不小心把计算机隐藏了怎么恢复,任务栏被隐藏如何恢复?
  7. poj 1655 Balancing Act(求树的重心)
  8. 程序员都知道的那点(97件)事儿!
  9. 用curl访问HTTPS站点并登录
  10. ios和android安全对比