2010-06-30 138 views
0

我遇到使用LINQ一些性能問題,導致我對我的第一個計算器問題:的LINQ查詢鏈執行順序

的測試功能在下面的代碼,執行的次數differente數這兩個linqs查詢:

int[] mydata = { 1, 2, 34, 5, 67, 8 };

var query = from i in mydata select new { i,v=test(i)};  
var query2 = query.Where(v=>v.v == 2); 
MessageBox.Show(query2.Count().ToString()); 

var query = from i in mydata where i==2 select new { i,v=test(i)};  
MessageBox.Show(query.Count().ToString()); 

而且伯爵()函數,確確實實需要評估選擇部分?這也意味着執行query2.Select(i => i)將激發測試()調用

如果這是要走的路,要執行類似調用的延遲過濾器,應將第二個查詢更改爲減少unnecesary測試()調用:

var query = from i in mydata where (filter ? v=filtevalue : true) select new { v=test(i)};  
MessageBox.Show(query.Count().ToString()); 

我需要執行是建立一個大的查詢中,然後過濾,在程序的不同部分的數據不執行的是filterout數據選擇部分(以避免性能損失)。這可能嗎?

在此先感謝。

回答

0

Count涉及枚舉。枚舉涉及執行Select,這執行test。如果你想只計算你根本不需要Select,因爲它不會改變元素的數量。如果您想在查詢中減少test來電的次數,請嘗試在Select之前輸入Where。 (.Where(..).Select(..))如果您的搜索謂詞(lamda在哪裏)取決於函數test的結果,則無法避免調用。