Insertion ou mise à jour en bloc dans la même fonction avec Dapper

dapper sql sql-server sql-server-2008

Question

Je souhaite créer une fonction dans ma couche d'accès aux données qui parcourra une liste de contacts et INSERT ou UPDATE selon que le contact est nouveau ou existant.

Je sais qu'avec Dapper, vous pouvez faire un insert en bloc en créant simplement une instruction INSERT et en lui transmettant une liste d'objets. Est-il possible de faire la même chose avec une mise à jour BULK? Ou encore mieux encore un InsertOrUpdate BULK.

Voici ma solution, y a-t-il un meilleur moyen? Je ne voulais vraiment pas appeler la fonction d'exécution une fois pour chaque contact de la liste.

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);
    }
}

Réponse populaire

Je ne peux pas parler à Dapper, j'ai jeté un coup d'œil rapide et il semble que Dapper devrait d'abord prendre en charge la fonctionnalité MERGE, ce qui n'est pas le cas. Mais, compte tenu de ce que vous avez dit ci-dessus, c'est ce que je ferais.

Tout d'abord, utilisez Dapper pour insérer en bloc les contacts dans une table temporaire, puis créez votre instruction MERGE et exécutez-la.

Appelons la table temp1. Dans temp1, row with id = 2 remplacera row avec id = 2 dans les contacts et row with id = 3 sera inséré dans les contacts.

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi