我使用的CodeSmith PLINQO的批量更新功能與下面的包裝代碼:如何篩選LINQ表達與CodeSmith的批量更新使用
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 Server錯誤:「傳入的表格格式的數據流(TDS)遠程過程調用(RPC)協議流不正確在該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;
}
我的CodeSmith的工具工作。有今年年初我們的論壇誰發佈此問題的用戶:http://community.codesmithtools.com/Template_Frameworks/f/66/t/12717.aspx我仍然認爲的最佳途徑是使用存儲過程。但是,他的解決方法與你的相似。 –