我正在尝试使用Dapper对IEnumerable参数对象的支持来执行INSERT INTO,但遇到了麻烦。
我的INSERT语句实际上基于SELECT:
INSERT INTO [tbl] ([col1], [col2], [col3])
OUTPUT Inserted.[id]
SELECT [col1] - 1, [col2] + 1, @newVal
FROM [tbl]
WHERE [id] IN @id AND [col1] > 1
我正在尝试使用Query<T>()
,如下所示:
int[] ids = ...;
var sql = @"INSERT INTO ..."; // from above
var parameters = ids.Select(id => new { id = id, newVal = GenerateNewValueForEachRow() }).ToArray();
IEnumerable<int> newIds = dbConnection.Query<int>(sql, parameters);
但我得到一个 InvalidOperationException :“在此上下文中不允许使用可枚举的参数序列(数组,列表等)”
我必须使用Query<T>()
代替Execute<T>()
(或例如ExecuteScalar<T>()
)因为我想要IEnumerable
的newIds。 (至少,我想我必须......对吗?)
此外,我想在插入每行时使用不同的@newVal
,否则我可以使用
var parameters = new { ids = ids, newVal = GenerateNewRepeatedValue() };
明显的答案是foreach
超过ids
:
// transactions and async are omitted
foreach (var id in ids)
{
var newId = dbConnection.ExecuteScalar<int>(
<slightly modified SQL>,
new { id = id, newVal = GenerateNewValueForEachRow() }
);
}
但我希望Dapper的内置功能可以为我做到这一点。它可以?谢谢!