Dapper对IEnumerables的支持可以简化INSERT INTO SELECT吗?

时间:2017-04-07 17:19:30

标签: c# sql sql-server dapper

我正在尝试使用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的内置功能可以为我做到这一点。它可以?谢谢!

0 个答案:

没有答案