次のラッパー コードで CodeSmith Plinqo の一括更新機能を使用しています。
public int Update<TEntity>(Expression<Func<TEntity, bool>> filter,
Expression<Func<TEntity, TEntity>> evaluator) where TEntity : class
{
var tbl = _dataContext.GetTable<TEntity>();
return tbl.Update(filter, evaluator);
}
使用例:
DCCore.Update<Code>(filter => _results.UpdatedCodes.Select(
x => x.CodeID).Contains(filter.CodeID),
u => new Code {
CodeStatusID = EpcEvent.CodeStatusID.Value
});
これは、「フィルター」に 2100 を超える要素が含まれている場合を除いてうまく機能し、次の SQL サーバー エラーが発生します。 RPC リクエスト。最大値は 2100 です。」
私がやりたいのは、「フィルター」式を 2000 個のアイテム チャンクに分割するように更新ラッパーを拡張することです。この擬似コードのようなもの:
public int Update<TEntity>(Expression<Func<TEntity, bool>> filter,
Expression<Func<TEntity, TEntity>> evaluator) where TEntity : class
{
var tbl = _dataContext.GetTable<TEntity>();
var index = 0;
const int chunk = 2000;
var filterCount = filter.Count();
while (index * chunk < filterCount)
{
var smallFilter = filter.Skip(index*chunk).Take(chunk);
tbl.Update(smallFilter, evaluator);
index++;
}
return filterCount;
}