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

时间:2016-10-05 22:38:05

标签: c# .net sql-server dapper

我有一个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<long>(sql, person).First();

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

IEnumerable<Person> people = ...;    
var ids = connection.Query<long>(sql, people);

我收到错误:

  

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

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

1 个答案:

答案 0 :(得分:3)

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

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

有一天,希望很快,我们将回顾字符串文字中的SQL,就像我们目前看goat sacrifice一样。