Один из подходов состоит в том, чтобы загрузить данные во временную таблицу, используя SqlBulkCopy , а затем запросить данные в соответствующих таблицах. Например:
- Создать временную таблицу
await connection.ExecuteAsync(@"CREATE TABLE #TempTable
(
[X] int NULL,
[Y] nvarchar(100) NULL,
[Z] datetime NULL
)", null, transaction);
Создать
DataTable
и заполнить данными CSV
DataTable table = new DataTable();
dataTable.Columns.Add("X", typeof(int));
dataTable.Columns.Add("Y", typeof(string));
dataTable.Columns.Add("Z", typeof(DateTime));
//foreach csv record...
var row = dataTable.NewRow();
row["X"] = 1;
row["Y"] = "test";
row["Z"] = DateTime.Now;
dataTable.Rows.Add(row);
Выполнить массовое копирование
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
bulkCopy.DestinationTableName = "#TempTable";
bulkCopy.EnableStreaming = true;
await bulkCopy.WriteToServerAsync(dataTable);
}
Запрос данных из временной таблицы в таблицы назначения.
Здесь вы можете выполнить существующие проверки записей . Удалить временную таблицу
await connection.ExecuteAsync("DROP TABLE #TempTable", null, transaction);
Я нашел этот подход намного быстрее, чем EF для массовых импорт данных в базу данных с сохранением бизнес-логики c.