Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 546|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-12 15:53:32 | 显示全部楼层 |阅读模式

    前言

      一般情况下,使用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,调用

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-23 06:13 , Processed in 0.060874 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表