ABP实现EF执行SQL(增删改查)解决方案
前言
一般情况下,使用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(增删改查)解决方案相关推荐
- abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之六(三十二)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- EF框架实现增删改查
EF框架实现增删改查 1.创建数据库:先创建两张表,文章类型表以及文章详情表,设置主外键(ID,Catelogid) Catelog:文章类型表 字段:Id(自增),Name,[Cont ...
- 测试开发面经(六)SQL增删改查
文章目录 测试开发面经(六)SQL增删改查 6. 查询(续) 53).查询未授课教师的姓名和系 54).按职称显示软件学院的教师人数. 55).查询成绩高于<数据结构>平均成绩的学生信息. ...
- html编辑ko,BootstrapTable+KnockoutJS相结合实现增删改查解决方案(三)两个Viewmodel搞定增删改查...
前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
JS组件系列--BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查 参考文章: (1)JS组件系列--BootstrapTable+Kno ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一)
JS组件系列--BootstrapTable+KnockoutJS实现增删改查解决方案(一) 参考文章: (1)JS组件系列--BootstrapTable+KnockoutJS实现增删改查解决方案( ...
- sql增删改查_增删改查!sql2pandas方法手册
数据分析 Author:louwill Machine Learning Lab 作为一名数据分析师,利用SQL熟练的取数是一项必备的基础能力.除了SQL以外,Python的pandas也为我们提供了 ...
- sql增删改查_快速搞定数据库增删改查|附思维导图
数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...
- sql增删改查_Sirvia 一套web端增删改查系统
众所周知,后端开发的一个重要组成部分就是数据库,数据的作用简单来说就是将网站的用户数据存起来,至于数据库的什么特性,一些奇技淫巧这里就不便赘述了,因为今天的主角是Sirvia--一套web端增删改查系 ...
- sql增删改查_面试速记之数据库增删改查|附思维导图
数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实.下面是关于 ...
最新文章
- C++ 宽字符(wchar_t)与窄字符(char)的转换
- java outofmemory jsp_Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结...
- 力扣: 268. 丢失的数字
- ubuntu各版本代号(更新至15.04)及各版本下载地址等
- 微内核和宏内核的区别_8086微处理器中的过程和宏之间的区别
- 别急,MIUI 11还有惊喜!下一代MIUI项目已开拔
- Python并发编程Futures
- 6.12使用tensorflow来搭建一个Transformer
- 1032 挖掘技术哪家强
- 编程必会的100个代码大全,建议收藏
- C语言与线性代数,编程与线性代数
- 如何关闭访达窗口_UG NX软件基础操作,如何自定义软件快捷键
- 如何在CAD中插入一个自定义对象?
- 生信识图 之 点图基础
- IE5的兼容问题——记录给自己看的
- 企业的五种组织架构模式
- 想知道raw转换jpg软件怎么用?教你raw转换的方法
- Zigbee应用之搭建开发环境
- Swaps in Permutation
- 承认多元化,保持宽容
热门文章
- linux ip地址本地缓存,ip-address – 如何解析组织的IP地址(使用缓存)
- mysql 1539_MySQL:半同步(三)从库端初始化和回调函数
- Pytorch基础(一) 初始tensor
- 油漆面积 java_第八屆藍橋杯省賽 JavaA組 第十題 標題:油漆面積
- java 合并csv_用java将三个csv表格文件,整合数据组合成一个文件。
- 手机不小心把计算机隐藏了怎么恢复,任务栏被隐藏如何恢复?
- poj 1655 Balancing Act(求树的重心)
- 程序员都知道的那点(97件)事儿!
- 用curl访问HTTPS站点并登录
- ios和android安全对比