ABP框架+Dapper执行原生sql

之前发表一个ABP框架+EF执行原生sql,后来自己想了想安装Dapper,用Dapper执行原生sql也可以,并且效率会比EF优一点。

一、首先安装Dapper

有多种方案安装,nuget包安装,或者执行命令

cs 复制代码
dotnet add package Dapper

二、项目中使用

注意在当前文件引用Dapper

cs 复制代码
using Dapper;

注入你要操作表的仓储

cs 复制代码
private readonly IRepository<WorkOrder, Guid> _repository;
public WorkOrderExtensionService( IRepository<WorkOrder, Guid> repository){
 _repository = repository;
}

写好自己要的sql业务,然后通过Dapper执行

cs 复制代码
var parameters = new
            {
                TenantId = _currentTenant.Id,
                SkipCount = input.SkipCount,
                PageSize = input.MaxResultCount,
                OrderId = orderId,
                OrderNo = input.OrderNo,
            };
            var sql = @"
                select w.SeriesNo,w.Seq, CASE WHEN r.SnCode is null THEN 0 ELSE 1 END `State` from JG_WorkOrderTasks w
                left join (
                select SnCode from JG_WorkOrderDistributionRecords
                where WorkOrderNumber = @OrderNo and DispatchStatus = 1
                group by SnCode
                ) r on w.SeriesNo = r.SnCode
                where w.OrderId = @OrderId and IsDeleted = 0 and TenantId = @TenantId
                order by `State`, Seq 
                limit @PageSize offset @SkipCount";
            var countSql = @"
                select count(0) from JG_WorkOrderTasks
                where OrderId = @OrderId and IsDeleted = 0 and TenantId = @TenantId";
            
            var dbContext = await _repository.GetDbContextAsync();
            var connection = dbContext.Database.GetDbConnection();
            if (connection.State != ConnectionState.Open)
                await connection.OpenAsync();
            var list = await connection.QueryAsync(sql, parameters);
            var snCount = await connection.ExecuteScalarAsync<int>(countSql, parameters);
            List<HitList> resData = list.Select(c => new HitList
            {
                SnCode = c.SeriesNo,
                Seq = c.Seq,
                HitState = c.State == 0 ? "未打标" : "已打标"
            }).ToList();

三、解析一下上面代码

数据库上下文和连接:

cs 复制代码
var dbContext = await _repository.GetDbContextAsync();
var connection = dbContext.Database.GetDbConnection();
if (connection.State != ConnectionState.Open)
    await connection.OpenAsync();
  • 通过 _repository 获取数据库上下文并获取数据库连接。
  • 检查连接状态,如果未打开,则异步打开连接。

执行查询:

cs 复制代码
var list = await connection.QueryAsync(sql, parameters);
var snCount = await connection.ExecuteScalarAsync<int>(countSql, parameters);
  • 使用 Dapper 的 QueryAsync 方法执行主查询,返回一个结果列表。
  • 使用 ExecuteScalarAsync<int> 执行计数查询,返回总记录数。

使用 Dapper 作为 ORM,使得 SQL 查询更为简洁高效,同时通过参数化查询提高了安全性(防止 SQL 注入)。整体结构清晰,符合常见的 .NET 开发模式。

相关推荐
herinspace1 小时前
管家婆实用贴-SQL 2008如何修改成混合模式
服务器·数据库·sql·管家婆软件·财务软件·合肥管家婆软件
淡海水2 小时前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
大模型最新论文速读4 小时前
text-to-sql:从学术玩具到生产落地
数据库·sql
WarPigs4 小时前
C#把byte[]以十六进制打印,带分割符
c#
Decay__4 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
zjx23885 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
暴走约伯5 小时前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
1-1=05 小时前
C# 反射
c#·.net·.netcore
一叶星殇5 小时前
版本即契约:.NET 6 WebAPI 多版本治理与 Swagger 文档分治实践
mvc·.net
杨云龙UP6 小时前
Oracle 同义词(SYNONYM)详解及 Toad for Oracle SQL 智能补全配置实战
运维·数据库·sql·oracle·同义词·toad·toad for oracle