You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:47:24