.NET Core WebApi CSV文件解析并存储在数据库中

bbr*_*nck 2 .net entity-framework asp.net-web-api asp.net-core

我正在使用 .NET Core WebApi 和 EF Core。

我有以下场景:

  • 我有一个接受 CSV 文件的端点
  • 此 CSV 文件包含超过 15.000 行
  • 我需要解析这个 CSV 文件并将每一行存储在我的数据库中
  • 在存储每一行​​之前,我需要检查里面的数据是否已经存在(需要检查 4-5 个值/行是否作为独立实体存在)

我的问题:

  1. 检查数据是否存在需要很长时间(15.000次4-5次检查......)

所以我想创建一些任务来将批处理存储在数据库中(但在 .NET Core WebApi 中),你不能运行后台任务,对吧?

你们将如何实现这一目标?

Oli*_*ver 5

一种方法是使用SqlBulkCopy将数据上传到临时表中,然后将数据查询到适当的表中。例如:

  1. 创建临时表
await connection.ExecuteAsync(@"CREATE TABLE #TempTable
(
    [X] int NULL,
    [Y] nvarchar(100) NULL,
    [Z] datetime NULL
)", null, transaction);

Run Code Online (Sandbox Code Playgroud)
  1. 创建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);

Run Code Online (Sandbox Code Playgroud)
  1. 执行批量复制
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
    bulkCopy.DestinationTableName = "#TempTable";
    bulkCopy.EnableStreaming = true;

    await bulkCopy.WriteToServerAsync(dataTable);
}
Run Code Online (Sandbox Code Playgroud)
  1. 将临时表中的数据查询到目标表中。 您可以在此处执行现有记录检查
  2. 删除临时表
await connection.ExecuteAsync("DROP TABLE #TempTable", null, transaction);
Run Code Online (Sandbox Code Playgroud)

我发现这种方法比 EF 快得多,可以将数据批量导入数据库,同时维护一些业务逻辑。