Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何筛选linq表达式以用于CodeSmith批量更新_C#_Linq_Codesmith_Plinqo - Fatal编程技术网

C# 如何筛选linq表达式以用于CodeSmith批量更新

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<

我将CodeSmith Plinko的批量更新功能与以下包装器代码一起使用:

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