如何过滤linq表达式以用于CodeSmith批量更新

时间:2012-10-02 15:01:21

标签: c# linq codesmith plinqo

我正在使用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.“

我想要做的是增强我的Update包装器,以便将“过滤器”表达式分解为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;
}

1 个答案:

答案 0 :(得分:0)

我为CodeSmith Tools工作。今年早些时候我们论坛上有一位用户发布了这个问题:http://community.codesmithtools.com/Template_Frameworks/f/66/t/12717.aspx我仍然认为最好的方法是使用存储过程。但是,他的修复与你的相似。