2017-01-24 49 views
0

我想創建一個函數,根據從數據庫中讀取的一系列bool值來修改查找。很差的性能修改查找

我試圖採取的做法是這樣的:

IEnumerable<RootDomain> lookup = db.RootDomains; 

//bools are nullable 
if (conditions.HasCompanyMatch == true) lookup = lookup.Where(x => x.Companies.Any(c => c.CompanyMatches.Count > 1)); 
if (conditions.HasCompanyMatch == false) lookup = lookup.Where(x => !x.Companies.Any(c => c.CompanyMatches.Count > 1)); 
if (conditions.HasEmail == true) lookup = lookup.Where(x => x.EmailMessages.Count() > 1); 
// etc.. more bool switches 

//very slow when it enumerated in any way 
var count = lookup.Count(); 

它的工作原理,但它是極其緩慢。當列舉的枚舉查找時,內存使用跳轉到800mb左右,並且需要幾分鐘時間,而如果我一步完成所有操作,只需幾秒鐘,內存就像60mb。

我假設這樣做是添加一些遞歸查詢或其他東西,但我不知道。

在不破壞性能的情況下達成此目標的正確方法是什麼?

+0

「而如果我做的這一切在一個步驟需要只需幾秒鐘「 - 你可以顯示你使用的代碼嗎? –

+0

我的意思是像'lookup = db.RoodDomains.Where(...).Where(...).Where(...)'在一個沒有任何if語句的情況下執行它。 – Guerrilla

+0

假設這是SQL服務器,是否使用概要分析工具調查了生成的SQL? –

回答

3

是否在您鏈接您的條件時評估每條語句?

我想治療你的初始查找作爲一個IQueryable將意味着當你去檢索數據(例如,您的計數)它應該只評價:

IQueryable<RootDomain> lookup = db.RootDomains; 
+0

YES!這固定了它。謝謝 – Guerrilla