1

次のラッパー コードで 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;
}
4

1 に答える 1

0

私は CodeSmith Tools で働いています。今年の初めにフォーラムにこの問題を投稿したユーザーがいました: http://community.codesmithtools.com/Template_Frameworks/f/66/t/12717.aspx私はまだストアド プロシージャを使用するのが最善の方法だと思います。ただし、彼の修正はあなたのものと似ていました。

于 2013-01-09T19:23:49.230 に答える