1

エンティティ フレームワークを使用して、Sql Server テーブルのすべての行を約 150,000 レコードで更新する必要があります。サーバーのヒット数を減らすために、これを 1000 行の個別のバッチで行いたいと考えています。次のエンティティ フレームワークが必要です。

  1. DB から最初の 1000 行を選択します。
  2. それらの行を更新します。
  3. SaveChanges() メソッドを呼び出します。
  4. 次の 1000 行を取得します。
  5. 繰り返す。

これを達成する最良の方法は何ですか?

エンティティ フレームワーク 4 と SQL Server 2012 を使用しています。

4

2 に答える 2

4

LINQ Skip & Takeを使用します。

return query.Skip(HOW MUCH TO SKIP -AT THE BEGINNING WILL BE ZERO-)
    .Take(HOW MUCH TO TAKE -THE NUMBER OF YOUR PAGING SIZE-).ToList();

ループ内で実行したい場合は、次のようにすることができます。

int pagingIncrement = 1000;
for (int i = 0; i <= 150 000; i=i+pagingIncrement)
{
    var query = your actual LINQ query.
    var results = query.Skip(i).Take(pagingIncrement);

    UpdatePartialResults(results);
}

注: これらの行を更新している間は、実際の LINQ クエリ内で ORDER BY の基準を更新しないことが重要です。そうしないと、(並べ替えのために) 同じ結果を何度も更新することになります。

他のアイデアは、IEnumerable イテレータを a などの以前に与えられたいくつかのアイデアで拡張し、Skip(counter).Take(pagingSize結果を生成することです (非同期的に処理するため)。

于 2012-09-13T18:04:32.343 に答える
2

このようなものはうまくいくはずです:

int skip =0;
int take = 1000;
for (int i = 0; i < 150; i++)
{
var rows = (from x in Context.Table
            select x).OrderBy(x => x.id).Skip(skip).Take(take).ToList();

//do some update stuff with rows

skip += 1000;
}
于 2012-09-13T18:38:09.307 に答える