为什么Dapper无法返回多个插入的行ID?

我有一个SQL Server表,其中插入行使用:

var sql = @" DECLARE @InsertedRows AS TABLE (Id BIGINT); INSERT INTO Person ([Name], [Age]) OUTPUT Inserted.Id INTO @InsertedRows VALUES (@Name, @Age); SELECT Id FROM @InsertedRows;"; Person person = ...; var id = connection.Query(sql, person).First(); 

这一切都很好,但是如果我尝试插入多个项目并使用以下命令返回所有插入的ID:

 IEnumerable people = ...; var ids = connection.Query(sql, people); 

我收到一个错误:

System.InvalidOperationException:在此上下文中不允许使用可枚举的参数序列(数组,列表等)
在Dapper.SqlMapper.GetCacheInfo(身份标识,对象exampleParameters,布尔addToCache)
在Dapper.SqlMapper.d__23`1.MoveNext()
—从抛出exception的先前位置开始的堆栈跟踪结束—

如何在Dapper中返回多个插入的ID?

某个地方需要循环。 你有一个sql语句插入一行,代码发送在列表中。 既然你喜欢字符串文字中的SQL,我会坚持一次插入一个人,将循环放在C#中并使用SELECT SCOPE_IDENTITY()恢复C#中的每个id。 您不再需要@InsertedRows或OUTPUT。

如果你真的想在SQL中循环,我相信你需要查看表值参数来传递插入列表。 Dapper非常乐意返回多个ID。 它抱怨多人作为输入参数。

有一天,希望很快,我们将回顾字符串文字中的SQL,就像我们现在看山羊牺牲一样 。