如何使用 Dapper 在同一查询中混合列表和常规参数

问题描述 投票:0回答:1

给定以下 MySQL 的 SQL 语句

var sql = @"INSERT INTO MyTable (Key1, Field1, Field2, Field3)
VALUES (@key, @field1, @field2, @field3)
ON DUPLICATE UPDATE Field3 = @existing";

我通常会像这样建立值列表(为此演示进行了高度修改)

var values = new List<Object> {
 { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" },
 { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" },
 { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx" },
};

然后我会简单地通过使用来执行这个:

await connection.ExecuteAsync(sql, values);

但是现在,我需要在同一 SQL 语句中添加这个额外的“ON DUPLICATE”语句。我如何将 params 对象放在一起来处理“@existing”参数?

c# mysql sql parameters dapper
1个回答
0
投票

您需要将

existing
参数添加到您传递给
ExecuteAsync
的参数值集合中的每个匿名对象。

例如,这最终只在数据库中插入一行,

Field3
的值为
"three"

var values = new List<Object> {
 new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "one" },
 new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "two" },
 new { key = "xxx", field1 = "xxx", field2 = "xxx", field3 = "xxx", existing = "three" },
};

await connection.ExecuteAsync("""
    INSERT INTO MyTable (Key1, Field1, Field2, Field3)
    VALUES (@key, @field1, @field2, @field3)
    ON DUPLICATE KEY UPDATE Field3 = @existing
    """, values);

(如果您希望插入的每一行的

@existing
值相同,您可以在每个匿名对象中将
existing =
设置为相同的值,而不是像我在本例中所做的那样使它们不同。)

© www.soinside.com 2019 - 2024. All rights reserved.