阅读本文后,我决定仔细研究一下我使用Dapper的方式.
我在一个空数据库上运行此代码
var members = new List<Member>();
for (int i = 0; i < 50000; i++)
{
    members.Add(new Member()
    {
        Username = i.toString(),
        IsActive = true
    });
}
using (var scope = new TransactionScope())
{
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
    scope.Complete();
}
花了大约20秒钟.这是2500插入/秒.不错,但考虑到博客达到45k插入/秒,也不是很好.在Dapper中有更有效的方法吗?
另外,作为旁注,通过Visual Studio调试器运行此代码需要3分钟!我认为调试器会慢一点,但我很惊讶地看到了这么多.
UPDATE
所以这
using (var scope = new TransactionScope())
{
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
    scope.Complete();
}
还有这个
    connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
都花了20秒.
但这需要4秒!
SqlTransaction …我有一个 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(Identity Identity, Object exampleParameters, Boolean addToCache)
at Dapper.SqlMapper.d__23`1.MoveNext() 的上下文中不允许使用可枚举的参数序列(数组、列表等)
--- 从先前抛出异常的位置开始的堆栈跟踪结束 ---
如何在 Dapper 中返回多个插入的 id?