EF core中批量读取数据并更新

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

我正在尝试分批读取数据,1k x 1k,直到处理完所有内容。

public async IAsyncEnumerable<IEnumerable<MyData>> GetData()
{
        var data = dbContext.MyTable.AsNoTracking().Where(d => d.Status == 2);
        int totalDataCount = await data.CountAsync();
        int processedData = 0;
        
        while (processedData < totalDataCount)
        {
            var currentData = await data.Take(999).ToListAsync();
            processedData += invoiceData.Count;

            yield return currentData;
        }
}

我不确定 NoTracking 标志是否可能导致这里出现相同数据一次又一次加载的问题。 消费代码:

await foreach (var data in myRepository.GetData())
{
    dbContext.ChangeTracker.Clear();
    
    await dbContext.Database.ExecuteSqlRawAsync($@"
    UPDATE ""MyTable""
    SET
    ""Status"" = 1
    WHERE ""Id"" in ({string.Join(',', data.Select(d => d.Id))}) AND ""Status"" != 2");
}

那么,NoTracking 是否可能是一个问题,因为查询的数据不会被检测为已更改?或者消费代码应该在原始 sql 更新之后包含使用其 Commit 方法的转换?

c# sql oracle entity-framework entity-framework-core
© www.soinside.com 2019 - 2024. All rights reserved.