Dapper - массовая вставка новых элементов и возврат новых идентификаторов

bulkinsert c#-4.0 dapper dapper-extensions sql

Вопрос

Я использую dapper, чтобы добавить нескольких новых учеников в один удар с помощью этого метода:

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

Но проблема в том, что у меня нет новых идентификаторов.

Могу ли я сделать один db-хит, а еще некоторые - как получить новые идентификаторы?
А если нет, то каков наиболее эффективный способ выполнения такой объемной вставки?

Ответ эксперта

Это не объемная вставка; это в основном просто сокращение, которое разворачивает цикл; хотя интересно (возможно), то можно попросить его к трубопроводу , что последовательность , если «МАРС» включен на подключение. Без трубопровода это в основном сокращается:

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

в этом случае вы можете также использовать Query или ExecuteScalar для извлечения SCOPE_IDENTITY() .

С трубопроводом он более тонкий; он делает то же самое, но с несколькими выдающимися командами за раз (он только await когда задержка заполнена или когда все команды были выпущены).

Массовая вставка не возвращает идентификаторы. Вы могли бы рассмотреть использование параметра, оцененного по таблице, и использовать INSERT с предложением OUTPUT для вставки всего DataTable данных за один раз (получение идентификаторов в процессе), но с отрицательной стороны: это связано с использованием DataTable ; p



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему