Dapper需通过应用层统一封装实现软删除查询过滤:采用基类+泛型仓储自动追加IsDeleted=0、SQL模板参数化、AOP拦截或扩展Query方法,仅对ISoftDelete类型生效。
Dapper 本身不内置软删除查询过滤器或全局拦截机制,它只是一个轻量级 ORM 工具,负责 SQL 映射和执
行。要实现类似 EF Core 中 HasQueryFilter 那样的“自动追加 IsDeleted = 0”效果,需在应用层主动控制——核心思路是:**统一封装查询逻辑,避免手写 SQL 漏掉条件,并通过约定或 AOP 方式降低侵入性。**
定义一个仓储基类(如 BaseRepository),所有实体继承自带 IsDeleted 字段的基类(如 ISoftDelete):
GetAll()、FindById() 等方法中,自动拼接 AND IsDeleted = 0
SqlBuilder 或字符串插值(注意防注入)构建可复用查询模板GetAllWithDeleted() 显式绕过把常用查询抽象成带占位符的 SQL 模板,例如:
SELECT * FROM {TableName} WHERE IsDeleted = 0 {WhereClause}
{TableName} 和拼接 {WhereClause}(确保只拼接安全字段)typeof(T).GetCustomAttribute() 自动获取表名,减少硬编码
若项目已用 Autofac / Castle Windsor / DynamicProxy,可对仓储接口做方法拦截:
Get、Find、Select 且返回集合或单个实体的方法IsDeleted = 0 条件(适用于表达式参数场景)connection.Query()
为 IDbConnection 添加扩展方法,覆盖常用查询入口:
QuerySoft(sql, param) :自动在 WHERE 后追加 AND IsDeleted = 0(需解析原始 SQL,较重但可控)QueryWithFilter(sql, param, filter = "IsDeleted = 0") :显式传入过滤条件,灵活支持多租户、状态等复合场景T : ISoftDelete)才生效,避免误伤其他表基本上就这些。没有银弹,但靠约定+封装+少量扩展,就能在 Dapper 里稳稳落地软删除查询逻辑,既保持轻量,又不失一致性。
来电咨询