TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2275 2.8K
День 1882. #ЗаметкиНаПолях
Массовые Вставки в C# и EF Core. Окончание

Начало

5. Dapper
Dapper — это простой преобразователь SQL в объекты .NET. Он позволяет нам легко вставить коллекцию объектов в БД:
using var conn = new SqlConnection(connString);
conn.Open();

var sql = @"
INSERT INTO Users (FirstName, LastName, Email, …)
VALUES (@FirstName, @LastName, @Email, …);";

await conn.ExecuteAsync(sql, GetUsers());

Результаты:
    100 пользователей - 10 мс
1000 - 113 мс,
10000 - 1,02 с,
100000 - 10,9 с,
1000000 - 109,065 с.


6. SQL Bulk Copy
Наконец, для SQL Server мы можем попробовать использовать SqlBulkCopy. Эта реализация немного сложнее. Во-первых, нужно создать объект DataTable, содержащий объекты, которые мы хотим вставить:
DataTable GetUsersDataTable()
{
var dt = new DataTable();
dt.Columns.Add(nameof(User.FirstName),
typeof(string));
dt.Columns.Add(nameof(User.LastName),
typeof(string));
dt.Columns.Add(nameof(User.Email),
typeof(string));
…

foreach (var u in GetUsers())
dt.Rows.Add(
u.FirstName, u.LastName, u.Email, …);

return dt;
}

Теперь настроим SqlBulkCopy для выполнения вставки:
using var bc = new SqlBulkCopy(ConnString);

bc.DestinationTableName = "dbo.Users";
bc.ColumnMappings.Add(
nameof(User.FirstName), "FirstName");
bc.ColumnMappings.Add(
nameof(User.LastName), "LastName");
bc.ColumnMappings.Add(
nameof(User.Email), "Email");

await bc.WriteToServerAsync(GetUsersDataTable());

Производительность невероятно высока:
    100 – 1,7 мс,
1000 - 7 мс,
10000 - 68 мс,
100000 - 646 мс,
1000000 - 7,34 с.


Итого
SqlBulkCopy работает быстрее всех, однако EF Core Bulk Extensions обеспечивают фантастическую производительность, сохраняя при этом простоту использования, которой славится Entity Framework Core. Поэтому выбор зависит от требований вашего проекта:
- Главное – производительность? SqlBulkCopy или EF Core Bulk Extensions.
- Не хочется платить и нужна простота разработки? Грамотное использование EF Core всё равно даёт неплохие результаты.

Источник: https://www.milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core
  • 👍 16
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →