基本的な詳細
データベースからいくつかのレコードを取得し、それらを System.Linq.Enumerable に入れる linq ステートメントがあります。
var someRecords = someRepoAttachedToDatabase.Where(p=>true);
これが大量 (25k+) のレコードを取得し、それらすべてに対して更新操作を実行する必要があるとします。処理を高速化するために、ページングを使用して、すべてのレコードを同時に処理するのではなく、必要な操作を 100 のブロック単位で実行することを決定する必要があります。
問題のコードは、データベース内の多くの値を更新するサービス メソッドと、古い値と更新された値を取得して更新が正しく実行されたことを確認する統合テストの 2 つの場所で使用されます。
質問
問題の行は、最後のページにいるかどうかを確認するためにサブセット内のレコード数をカウントする行です。サブセット内のレコード数がページングのサイズよりも少ない場合、それ以上レコードが残っていないことを意味します。私が知りたいのは、これを行うための最速の方法は何ですか?
問題のコード
int pageSize = 100;
bool moreData = true;
int currentPage = 1;
while (moreData)
{
var subsetOfRecords = someRecords.Skip((currentPage - 1) * pageSize).Take(pageSize); //this is also a System.Linq.Enumerable
if (subsetOfRecords.Count() < pageSize){ moreData = false;} //line in question
//do stuff to records in subset
currentPage++;
}
私が考えたこと
- subsetOfRecords.Count() < pageSize
- subsetOfRecords.ElementAt(pageSize - 1) == null (範囲外の例外が発生します - 例外をキャッチして、そこで moreData を false に設定できます)
- subsetOfRecords を配列に変換する (someRecords を配列に変換することは、subsetOfRecords が宣言されている方法のために機能しませんが、私はそれを変更しても構いません)
私が見逃したアイデアは他にもたくさんあると思います。