进行大型 CRUD 操作的最佳方式

问题描述 投票:0回答:0

我正在开发一个应用程序,我需要从数据库中获取大量数据,进行一些数据操作,然后将数据插入另一个数据库。

但是我正在努力寻找最好的方法来检查源数据库中的记录是否已经存在于目标数据库中。如果不存在,我需要添加一条新记录,如果存在,我需要更新现有记录。

我的代码看起来像这样(一个简单的版本):

List<Data> data_from_db = new();

var existingData = await _context.Data.ToListAsync();

var sourceData = await _dbAccess.LoadData<Data, dynamic>(storedProcedure: "sp_ApiGetAllData", new { }, "Db");

data_from_db = sourceData.ToList();

//loop through data. If the datapoint is already present in db, it will be updated, if not it will be added as a new datapoint.
foreach (var datapoint in data_from_db)
{
    //check if price is already present in db.
    var existingDatapoint = existingData.Find(x => x.ItemId== datapoint.ItemId);

    if (existingDatapoint != null)
    {
        //Update datapoint

        _context.Entry(existingDatapoint).State = EntityState.Modified;
        
        processedIds.Add(existingDatapoint.Id);
    }

    else
    {
        //Create new datapoint
        _context.Data.Add(newDatapoint);
    }
}

await _context.SaveChangesAsync();

这很好用,但是当数据库有 +400K 行时,这个过程会变得非常缓慢。 特别是“查找”功能需要花费大量时间。而且这很有意义,因为它将在列表中进行 400k * 400k 次搜索。

有没有更好的方法来处理这个问题?

c# entity-framework crud
© www.soinside.com 2019 - 2024. All rights reserved.