2012-08-06 55 views
3

如果我有形式有條件的地方過濾器使用延遲執行的地方嗎?

var query = from items in entityDb.TableName 
      join requestedBy in entityDb.People on items.RequestedById equals requestedBy.PersonId in requestedByOuter 
      from requestedBy in requestedByOuter.DefaultIfEmpty() 
      select items; 

的查詢還以爲這是一個很大的查詢,10個連接。然後我有一個條件篩選器

if (!string.IsNullOrEmpty(phaseFilter)) 
{ 
    query = query.Where(item => item.Phase == phaseFilter); 
} 

在這一點上我相信我已經失去了延期執行的優勢。 1000結果可能會損害性能。考慮到我的查詢實際上是50行代碼,我寧願不去...

if(phaseFilter not null) 
    //50 lines.... 
else if(filter2 not null) 
    //50 lines... 
else if (filter2 not null and phaseFilter not null) 
    //50 lines... 

唉。我可以不知何故擁有我的蛋糕並且也可以吃嗎?

回答

6

不,你不會失去它。執行仍然延遲,因爲.Where只是返回一個IEnumerable<T>,它過濾了傳遞給它的IEnumerable<T>,並且在執行此操作時它仍然被延遲。

+1

我認爲你的意思是IQueryable,而不是IEnumerable。 – usr 2012-08-06 16:20:36

+0

@usr:['IQueryable :IEnumerable '。](http://msdn.microsoft.com/zh-cn/library/bb351562.aspx) – Ryan 2012-08-06 16:23:10

4

不,您不會失去延期執行的情況。

您可以通過多次調用Where來修改IQueryable,當您列舉IQueryable時,將會執行實際查詢。

以上適用於其他方法,例如OrderBy

+0

所有返回「IEnumerable」,「IQueryable」或從其中一個派生出來的方法都被推遲。所有不做的方法都不是。 – Servy 2012-08-06 16:28:32