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 开发模式。

相关推荐
小程故事多_802 小时前
开源界核弹级输出!蚂蚁 Agentar-Scale-SQL 凭 “编排式扩展” 技术,成为 Text-to-SQL 天花板
数据库·人工智能·sql·开源·aigc·embedding
在路上看风景2 小时前
1.15 并行编程
c#
chao1898443 小时前
基于C# WinForm实现的仿微信打飞机游戏
游戏·微信·c#
wearegogog1234 小时前
C# 条码打印程序(一维码 + 二维码)
java·开发语言·c#
sali-tec4 小时前
C# 基于halcon的视觉工作流-章69 深度学习-异常值检测
开发语言·图像处理·算法·计算机视觉·c#
我是唐青枫4 小时前
深入理解 C#.NET 运算符重载:语法、设计原则与最佳实践
开发语言·c#·.net
Lv11770084 小时前
Visual Studio中的字典
ide·笔记·c#·visual studio
helloworddm6 小时前
LocalGrainDirectory详解
c#
武藤一雄6 小时前
.NET 中常见计时器大全
microsoft·微软·c#·.net·wpf·.netcore