我正在尝试分批读取数据,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 方法的转换?