我将 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 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;
}