如何在Dapper的同一条查询中混合使用列表与常规参数
处理Dapper批量插入中ON DUPLICATE KEY UPDATE的@existing参数
一、@existing是全局固定值
如果所有重复行的Field3都要更新为同一个固定值,有两种简便方式:
方式1:给每个参数对象添加existing属性
直接在构造的匿名对象列表里,为每个对象加上existing属性,对应SQL中的@existing参数:
var values = new List<object> { new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "固定值" }, new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "固定值" }, new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "固定值" }, }; await connection.ExecuteAsync(sql, values);
方式2:传递全局参数(更高效)
利用Dapper支持的参数合并特性,不用修改原有列表,直接在ExecuteAsync时额外传入包含existing的全局参数对象:
// 原有值列表保持不变 var values = new List<object> { new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" }, new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" }, new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" }, }; // 执行时传入全局参数 await connection.ExecuteAsync(sql, values, new { existing = "固定值" });
二、@existing是每行独立的不同值
如果每条数据对应的@existing值都不一样,只需要在构造匿名对象时,为每个对象单独设置existing属性即可:
var values = new List<object> { new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "行1专属值" }, new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "行2专属值" }, new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "行3专属值" }, }; await connection.ExecuteAsync(sql, values);
注意事项
- 你的SQL语句里
ON DUPLICATE UPDATE是语法简写,MySQL标准语法应为ON DUPLICATE KEY UPDATE,需要确保Key1字段是唯一键/主键,否则该逻辑不会触发。 - Dapper会自动匹配参数名称(大小写不敏感),只要参数对象的属性名和SQL中的占位符名称一致即可。
内容的提问来源于stack exchange,提问作者Talon
相关产品推荐
相关产品推荐

