古いレコードを消去したい大きなテーブルがあります。レコードには「FilePath」フィールドがあります。ここでの「クリア」とは、「FilePath」を null としてマークすることを意味します。問題は、テーブルに何百万ものレコードがあるため、一度更新することは不可能です。それは記憶を吹き飛ばします。したがって、私の戦略は、毎回 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 が null になるためです。その後、次の実行では、1 つのブロックをスキップするため、正しいブロックを指していない可能性があります。
スキップ部分を削除する必要がありますか?