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

本文关键字:插入 id Dapper 返回 为什么 | 更新日期: 2023-09-27 18:11:58

我有一个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);

我得到一个错误:

系统。InvalidOperationException:在此上下文中不允许使用可枚举的参数序列(数组、列表等)
在Dapper.SqlMapper。GetCacheInfo(Identity Identity, Object exampleParameters, Boolean addToCache)
1. Dapper.SqlMapper.d__23"movenext ()
——从抛出异常的前一个位置开始的堆栈跟踪结束——

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

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

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

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

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