Dapper - Insertion en bloc de nouveaux éléments et récupération de nouveaux identifiants

bulkinsert c#-4.0 dapper dapper-extensions sql

Question

J'utilise dapper pour ajouter plusieurs nouveaux étudiants dans une db hit en utilisant cette méthode:

db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)", 
  students.Select(s => new { Name = s.Name, Age = s.Age })
);

Mais le problème, je n'ai pas les nouveaux identifiants.

Est-ce que je peux faire un db hit et que certains obtiennent encore les nouveaux identifiants?
Et si non, quelle est la manière la plus efficace de réaliser un tel insert en vrac?

Réponse d'expert

Ce n'est pas un insert en vrac; c'est simplement un raccourci qui déroule la boucle; Bien que intéressant (peut-être), il est possible de lui demander de canaliser cette séquence si "MARS" est activé sur votre connexion. Sans le pipeline, il s'agit essentiellement d'un raccourci pour:

foreach(var obj in students.Select(s => new { Name = s.Name, Age = s.Age }))
{
    await db.ExecuteAsync(@"INSERT Student(Name,Age) values (@Name,@Age)", obj);
}

Dans ce cas, vous pouvez aussi utiliser Query ou ExecuteScalar pour récupérer SCOPE_IDENTITY() .

Avec le pipeline, c'est plus subtil; il fait la même chose, mais avec plusieurs commandes en await à la fois (il await que lorsque le backlog est plein, ou lorsque toutes les commandes ont été émises).

L'insertion en bloc ne renvoie pas d'identifiant. Vous pouvez envisager d'utiliser un paramètre table et d'utiliser INSERT avec la clause OUTPUT pour insérer un DataTable complet de données à la fois (en obtenant les identités dans le processus), mais du côté négatif: cela implique l'utilisation de DataTable ; p



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