. NET Разбор и хранение Core WebApi CSV-файла в БД - PullRequest
1 голос
/ 14 апреля 2020

Я использую. NET Core WebApi и EF Core.

У меня есть следующий сценарий:

  • У меня есть конечная точка, которая принимает файл CSV
  • Этот CSV-файл содержит более 15.000 строк
  • Мне нужно проанализировать этот CSV-файл и сохранить каждую строку в моей базе данных
  • Прежде чем сохранять каждую строку, мне нужно проверить, находятся ли данные внутри уже существует (необходимо проверить 4-5 значений / строку, если они существуют как независимые объекты)

Мои проблемы:

  1. Проверка наличия данных требует долгое время (15.000 раз 4-5 проверок ...)

Поэтому я хотел, возможно, создать несколько задач для хранения пакетных данных в БД (но в. NET Core WebApi), вы не можете запустить Background задачи, верно?

Как бы вы, ребята, достигли этого?

1 Ответ

2 голосов
/ 14 апреля 2020

Один из подходов состоит в том, чтобы загрузить данные во временную таблицу, используя SqlBulkCopy , а затем запросить данные в соответствующих таблицах. Например:

  1. Создать временную таблицу
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.

...