2012-10-02 55 views
1

我使用的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; 
} 
+0

我的CodeSmith的工具工作。有今年年初我們的論壇誰發佈此問題的用戶:http://community.codesmithtools.com/Template_Frameworks/f/66/t/12717.aspx我仍然認爲的最佳途徑是使用存儲過程。但是,他的解決方法與你的相似。 –

回答

0

我爲CodeSmith Tools工作。有今年年初我們的論壇誰發佈此問題的用戶:http://community.codesmithtools.com/Template_Frameworks/f/66/t/12717.aspx我仍然認爲的最佳途徑是使用存儲過程。但是,他的解決方法與你的相似。

+0

我可以使用明確的單個語句的跳過工作。我希望我能找到一種方法,使通用的,所以,任何時候我試圖用5000條記錄運行的更新它會塊對我來說。 – jhilden