使用Dapper在同一功能中批量插入或更新

时间:2015-06-17 19:28:03

标签: sql sql-server sql-server-2008 dapper

我想在我的数据访问层中创建一个函数,它将遍历联系人列表,并根据联系人是新的还是现有的情况进行INSERT或UPDATE。

我知道Dapper只需创建一个INSERT语句并传递一个对象列表即可进行批量插入。是否有可能对BULK更新做同样的事情?或者更好的是BULK InsertOrUpdate。

这是我的解决方案,有更好的方法吗?我真的不想为列表中的每个联系人调用一次执行函数。

StringBuilder insertSql = new StringBuilder();
insertSql.AppendLine("INSERT INTO Contact (FirstName, LastName, Email ");
insertSql.AppendLine("VALUES(@FirstName, @LastName, @Email);");

StringBuilder updateSql = new StringBuilder();
updateSql.AppendLine("UPDATE Contact ");
updateSql.AppendLine("SET FirstName = @FirstName, ");
updateSql.AppendLine("    LastName = @LastName, ");
updateSql.AppendLine("    Email = @Email ");
updateSql.AppendLine("WHERE Id = @Id");

foreach (Contact contact in contacts)
{
    if (contact.Id == 0)
    {
        context.Database.Connection.Execute(insertSql.ToString(), contact);
    }
    else
    {
        context.Database.Connection.Execute(updateSql.ToString(), contact);
    }
}

1 个答案:

答案 0 :(得分:0)

我无法与Dapper交谈,我快速浏览了一下,似乎Dapper首先需要支持MERGE功能,但它可能不会。但是,鉴于你上面所说的,这就是我要做的。

首先,使用Dapper将联系人批量插入某个临时表,然后构建MERGE语句并执行它。

让我们调用表temp1。在temp1中,id为2的行将替换联系人中id = 2的行,而id = 3的行将插入到联系人中。

create table contacts (id int, alias varchar(10))
create table temp1 (id int, alias varchar(10))
go

insert into temp1 values (2, 'nameX'), (3, 'name3')
insert into contacts values (1, 'name1'), (2, 'name2')
go

MERGE contacts c
USING temp1 t
ON (c.id = t.id) 
WHEN NOT MATCHED BY TARGET
    THEN INSERT(id, alias) VALUES(t.id, t.alias)
WHEN MATCHED 
    THEN UPDATE SET c.alias = t.alias
;
go

select * from contacts
go