我有一张大桌子,我想在其中清除旧记录。记录有一个字段“文件路径”。这里的“清除”是指将“文件路径”标记为空。问题是因为该表有数百万条记录,一次更新是不可能的。它炸毁了记忆。所以我的策略是每次获取 2000 行并更新它们,然后继续处理下一个块。
我的查询:
int pageNumber = 0;
int pageSize = 2000;
bool hasHitEnd = false;
while (!hasHitEnd)
{
var size = pageNumber * pageSize;
var query = cdrContext.Mytable.Where(c => c.FacilityID == facilityID && c.FilePath != null && c.TimeStationOffHook < oldDate)
.OrderBy(c => c.TimeStationOffHook)
.Skip(size)
.Take(pageSize)
.Select(c => new { c.FilePath, c.FileName })
.ToList();
var q = cdrContext.Mytable.Where(c => c.FacilityID == facilityID && c.FilePath != null && c.TimeStationOffHook < oldDate)
.OrderBy(c => c.TimeStationOffHook)
.Skip(size)
.Take(pageSize)
.ToList();
foreach (var y in q)
{
y.FilePath = null;
}
cdrContext.SaveChanges();
if (query.Count() < pageSize)
{
hasHitEnd = true;
}
pageNumber++;
我对代码没有信心。因为更新数据后,FilePath 为空。然后在下一次运行中,当我跳过一个块时,它可能不会指向正确的块。
我需要删除跳过部分吗?