全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Dapper如何批量更新数据 Dapper Bulk Update高效实现

Dapper 本身不支持批量更新,需借助原生 SQL、表值参数(TVP)、临时表或第三方库(如 RepoDB、Dapper.FastCRUD)实现;推荐 TVP + JOIN 方式,避免 foreach 循环和字符串拼接。

Dapper 本身不内置批量更新(Bulk Update)功能,它是一个轻量级 ORM,专注于单条 SQL 执行和映射。要实现高效批量更新,需结合原生 SQL、表值参数(TVP)、临时表或第三方扩展库(如 Dapper.FastCRUD、Dapper.Contrib 或更主流的 SqlKata + SqlServer 配合 TVP)。核心思路是:避免循环执行单条 UPDATE,改用一次 SQL 操作更新多行。

使用表值参数(TVP)+ 原生 SQL(推荐,SQL Server)

这是最常用、性能好且可控性强的方式。先在 SQL Server 中创建用户定义表类型(UDT),再通过 DataTable 或自定义 IDataReader 传入多行数据,在 UPDATE 中 JOIN TVP 完成批量更新。

  • 在数据库中提前建好 TVP 类型,例如:CREATE TYPE dbo.UpdateUserTableType AS TABLE (Id INT, Name NVARCHAR(50), Email NVARCHAR(100));
  • C# 中构造 DataTable,列名/类型严格匹配 TVP;或用 Dapper.SqlMapper.Execute 配合 new SqlMapper.ICustomQueryParameter 实现高效传参
  • SQL 写法示例:UPDATE u SET u.Name = t.Name, u.Email = t.Email FROM Users u INNER JOIN @updates t ON u.Id = t.Id;

拼接动态 SQL(小批量、简单场景)

适用于更新数据量较小(比如 ≤ 100 条)、字段固定、且对 SQL 注入有严格校验的场景。用 StringBuilder 拼出 CASE WHEN 或 VALUES + JOIN 形式。

  • 例如用 UPDATE t SET col = CASE id WHEN 1 THEN 'a' WHEN 2 THEN 'b' END WHERE id IN (1,2)
  • 注意参数化:所有值必须通过 @p0, @p1... 参数传入,不可字符串拼接值
  • Dapper 支持匿名对象或 DynamicParameters,可配合 Dictionary 或 List 构建参数集合

借助成熟扩展库(省事但引入依赖)

如果项目允许引入第三方包,Dapper.FastCRUDRepoDB 提供了开箱即用的 BulkUpdate 方法(底层仍走 TVP 或 SqlBulkCopy)。

  • connection.BulkUpdate(users, batchSize: 1000); —— RepoDB 示例,支持实体类直接更新
  • Dapper.FastCRUD 要求实体有主键标记,调用 UpdateAsync(IEnumerable) 即可
  • 注意:这些库在非 SQL Server 环境(如 PostgreSQL、MySQL)行为可能受限,需查文档确认支持情况

避坑提醒:什么方式不推荐

以下做法看似简单,实际在生产环境应避免:

  • 用 foreach 循环调用 connection.Execute("UPDATE ...", item) —— N+1 查询,性能极差
  • 手动拼接 SQL 字符串并插入值(未参数化)—— SQL 注入高危
  • 用 INSERT INTO ... SELECT + MERGE 替代 UPDATE,逻辑复杂且易出错,除非真需要 upsert 语义

基本上就这些。真正高效的 Dapper 批量更新,关键不在“用哪个库”,而在于是否绕开了逐条执行、是否利用了数据库原生批量能力(如 TVP、MERGE、SqlBulkCopy)。选型时优先考虑数据库兼容性、团队熟悉度和维护成本。


# mysql  # app  # ai  # sqlserver  # c#  # sql  # Object  # foreach  # select  # 字符串  # int  # 循环  # 值参数  # 对象  # table  # postgresql  # 数据库  # 第三方  # 单条  # 这是  # 适用于  # 它是  # 自定义  # 不支持  # 较小  # 先在  # 数据库中 


相关文章: 定制建站如何定义?其核心优势是什么?  如何在腾讯云服务器上快速搭建个人网站?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  制作宣传网站的软件,小红书可以宣传网站吗?  如何快速生成高效建站系统源代码?  如何用PHP快速搭建高效网站?分步指南  如何批量查询域名的建站时间记录?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  网页设计与网站制作内容,怎样注册网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  Swift中swift中的switch 语句  如何选择可靠的免备案建站服务器?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  网站制作难吗安全吗,做一个网站需要多久时间?  重庆市网站制作公司,重庆招聘网站哪个好?  如何快速重置建站主机并恢复默认配置?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  广州建站公司哪家好?十大优质服务商推荐  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站主机类型有哪些?如何正确选型  制作销售网站教学视频,销售网站有哪些?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何在Tomcat中配置并部署网站项目?  如何通过二级域名建站提升品牌影响力?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  javascript中对象的定义、使用以及对象和原型链操作小结  常州企业网站制作公司,全国继续教育网怎么登录?  C++中引用和指针有什么区别?(代码说明)  如何用虚拟主机快速搭建网站?详细步骤解析  佛山企业网站制作公司有哪些,沟通100网上服务官网?  javascript基本数据类型及类型检测常用方法小结  常州自助建站工具推荐:低成本搭建与模板选择技巧  ,制作一个手机app网站要多少钱?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  如何配置IIS站点权限与局域网访问?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  专业商城网站制作公司有哪些,pi商城官网是哪个?  XML的“混合内容”是什么 怎么用DTD或XSD定义  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  如何通过服务器快速搭建网站?完整步骤解析  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  ,购物网站怎么盈利呢?  如何在阿里云高效完成企业建站全流程?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。