2012-05-08 76 views
0

比方說,我有以下的代碼位(我知道可能是容易修改,以更好的表現,但它說明了什麼我想要做的)操縱實體框架,以消除往返數據庫

List<Query> l = new List<Query>; 
// Query is a class that doesn't exist, it represents an EF operation 

foreach (var x in Xs) 
{ 
    Query o = { context.someEntity.Where(s=>s.Id==x.Id).First();} 
    // It wouldn't execute it, this is pseudo code for delegate/anonymous function 
    l.Add(o) 
} 

然後將查詢列表發送給EF,並對其進行優化,使其儘可能減少往返次數。我們稱之爲BatchOptimizeAndRun;你會說

var results = BatchOptimizeAndRun(l); 

而且知道它從架構知道它會在整個查詢降低到最佳版本並執行,並把所讀取的結果在數組中。

我希望我已經描述了我正在尋找的東西,更重要的是它存在。 如果我聽起來像一個瘋狂的瘋子,讓我們假裝這個問題從來沒有存在過。

+3

我的建議是不要試圖彎曲EF的意願。在可能的地方利用它,在無法避開的地方繞過它。很多時候,當人們這樣做時,他們最終會遇到一堆難以維護的代碼,並且他們可能會在更短的時間內使用直接ado.net創建一些動態的參數化查詢。如果EF中有一個功能直接解決這個問題,那麼你應該明顯地使用它,但除此之外,我會說做一個不同的方式。 –

回答

2

我不得不迴應摩爾先生的建議,因爲我也花了太長時間構建一個單一比例的linq-to-entities查詢,結果發現我可以在更短的時間內完成一個存儲過程,更容易閱讀和更快執行。這就是說在你的例子說...

List<int> ids = Xs.Select(x => x.Id).ToList(); 
var results = context.someEntity.Where(s => ids.Contains(s.Id)).ToList(); 

我相信,這將彙編成類似

SELECT 
    * 
FROM 
    someEntity 
WHERE 
    Id IN (ids) --Where ids is a comma separated list of INT 

這將提供你所需要的。