Dapper 删除数据本质是执行参数化 DELETE SQL 语句,无内置删除方法;需注意事务、软删、批量和级联等场景,推荐按主键/条件单删、事务多表删、UPDATE 软删、IN 或表值参数批量删。

Dapper 删除数据本质就是执行一条 DELETE SQL 语句,它不自带“删除方法”,而是通过 Execute(或 ExecuteAsync)直接运行参数化 SQL。操作简单、高效,但需注意事务、软删、批量和级联等实际场景。
基础单条删除
最常用的方式:按主键或条件删除一条记录,使用参数化防止 SQL 注入。
- SQL Server 示例:
using (var conn = new SqlConnection(connStr))
{
int rows = conn.Execute("DELETE FROM Products WHERE Id = @Id", new { Id = 123 });
Console.WriteLine($"影响 {rows} 行");
}
- MySQL 示例(注意参数占位符用
@或?,取决于驱动):
using (var conn = new MySqlConnection(connStr))
{
int rows = conn.Execute("DELETE FROM users WHERE id = @id", new { id = 456 });
}
✅ 提示:Dapper 会自动打开连接(如果关闭),无需手动调用 Open();执行完自动释放资源。
带事务的多表删除
当要同时删主表和从表(如删除订单同时删订单项),必须用事务保证原子性。
- 用
IDbTransaction显式控制:
using (var conn = new SqlConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
try
{
conn.Execute("DELETE FROM OrderItems WHERE OrderId = @OrderId", new { OrderId }, tran);
conn.Execute("DELETE FROM Orders WHERE Id = @OrderId", new { OrderId }, tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
软删除替代物理删除
不真正删数据,只标记为“已删除”,适合审计、恢复、权限控制等场景。
- 模型加字段:
public bool IsDeleted { get; set; } = false; - 删除操作改为更新:
conn.Execute("UPDATE Products SET IsDeleted = 1 WHERE Id = @Id", new { Id = 789 });
- 后续所有查询都要加过滤:
WHERE IsDeleted = 0 - 建议给
IsDeleted字段建索引(尤其数据量大时)
批量删除(高效处理大量数据)
避免循环逐条删(慢且易超时),推荐以下两种主流方式:
-
IN 方式(适合几百到两千条):
var ids = new List{ 1001, 1002, 1003 };
int affected = conn.Execute("DELETE FROM Logs WHERE Id IN @Ids", new { Ids = ids });
⚠ 注意:SQL Server 中IN最多支持约 2100 个参数,超量需分批。 -
表值参数(TVF,适合上万条):
需先在数据库创建类型(如CREATE TYPE IntList AS TABLE (Id INT)),再传 DataTable 或 IEnumerable。性能最优,一次往返完成。
基本上就这些。Dapper 删除不复杂,但容易忽略事务安全、软删一致性、批量性能边界这些关键点。按需选择,别硬套一种模式。










