Dapper: inserción masiva de nuevos artículos y obtener nuevos ID

bulkinsert c#-4.0 dapper dapper-extensions sql

Pregunta

Estoy usando dapper para agregar varios estudiantes nuevos en un golpe de db usando este método:

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

Pero el problema es que no tengo los nuevos identificadores.

¿Puedo hacer un hit de db y aún así obtener los nuevos ids?
Y si no, ¿cuál es la forma más eficiente de realizar dicha inserción masiva?

Respuesta experta

Eso no es una inserción masiva; es básicamente taquigrafía lo que desenrolla el bucle; aunque curiosamente (tal vez) es posible pedirle que canalice esa secuencia si "MARS" está habilitado en su conexión. Sin la tubería, es básicamente una forma abreviada de:

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

en ese caso, también podría usar Query o ExecuteScalar para obtener SCOPE_IDENTITY() .

Con la tubería, es más sutil; hace lo mismo, pero con múltiples comandos pendientes a la vez (solo await s cuando la acumulación está llena o cuando se han emitido todos los comandos).

La inserción masiva no devuelve identificadores. Podría considerar usar un parámetro con valores de tabla y usar INSERT con la cláusula OUTPUT para insertar una DataTable completa de datos a la vez (obteniendo las identidades en el proceso), pero en el lado negativo: implica el uso de DataTable ; p



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué