.NET核心WebApi CSV文件解析和存储在数据库中

.NET核心WebApi CSV文件解析和存储在数据库中,.net,entity-framework,asp.net-core,asp.net-web-api,.net,Entity Framework,Asp.net Core,Asp.net Web Api,我正在使用.NET Core WebApi和EF Core 我有以下情况: 我有一个接受CSV文件的端点 此CSV文件包含超过15000行 我需要解析这个CSV文件并将每一行存储在我的数据库中 在存储每一行之前,我需要检查其中的数据是否已经存在(4-5个值/行需要检查它们是否作为独立实体存在) 我的问题: 检查数据是否存在需要很长时间(15000次4-5次检查…) 所以我想创建一些任务来将batchwhise存储在DB中(但在.NET Core WebApi中),您不能运行后台任务,对吗 你

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

我有以下情况:

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

  • 检查数据是否存在需要很长时间(15000次4-5次检查…)
  • 所以我想创建一些任务来将batchwhise存储在DB中(但在.NET Core WebApi中),您不能运行后台任务,对吗


    你们是怎么做到的

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

  • 创建临时表
  • 创建
    DataTable
    并填充CSV数据
  • 执行批量复制
  • 将临时表中的数据查询到目标表中这是您可以执行现有记录检查的地方
  • 放下临时桌子

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

    您可以使用批量复制程序将数据上载到临时表中,然后将数据查询到适当的表中。这对于批量操作来说要快得多。您是否看到随着时间的推移,文件越来越大?从15K线路到15M线路或15B线路时会发生什么情况?如果是这样的话,使用ETL过程可能是一个更好的选择。检查所针对的表有多大,不能将其全部加载到内存中吗?至少有4-5列..@RajMore你说的这到底是什么意思(ETL)?这是一些错误的线索
    await connection.ExecuteAsync(@"CREATE TABLE #TempTable
    (
        [X] int NULL,
        [Y] nvarchar(100) NULL,
        [Z] datetime NULL
    )", null, transaction);
    
    
    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);