C# 如何筛选linq表达式以用于CodeSmith批量更新
我将CodeSmith Plinko的批量更新功能与以下包装器代码一起使用:C# 如何筛选linq表达式以用于CodeSmith批量更新,c#,linq,codesmith,plinqo,C#,Linq,Codesmith,Plinqo,我将CodeSmith Plinko的批量更新功能与以下包装器代码一起使用: public int Update<TEntity>(Expression<Func<TEntity, bool>> filter, Expression<Func<TEntity, TEntity>> evaluator) where TEntity : class { var tbl = _dataContext.GetTable<
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);
}
这非常有效,除非“筛选器”包含的元素超过2100个,否则会出现sql server错误:“传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确。此RPC请求中提供的参数太多。最大值为2100。”
我想做的是增强我的更新包装器,以便它将“filter”表达式分解为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;
}
public int更新(表达式过滤器,
表达式计算器),其中tenty:class
{
var tbl=_dataContext.GetTable();
var指数=0;
const int chunk=2000;
var filterCount=filter.Count();
while(索引*块
我在CodeSmith工具公司工作。今年早些时候,我们论坛上有一位用户发布了这个问题:我仍然认为最好的方法是使用存储过程。不过,他的修复方法与您的类似。我在CodeSmith工具公司工作。今年早些时候,我们论坛上有一位用户发布了这个问题:我仍然认为最好的方法是使用存储过程。然而,他的修正和你的相似。我可以让它在一条语句中显式地使用skip-take。我希望我能找到一种通用的方法,这样每当我试图运行一个5000条记录的更新时,它都会帮我把它分块。
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;
}