2011-08-03 80 views
0

我有這下面的代碼,其中我篩選出類型不是「type1」。動態查詢linq使用c#where條款

List = Details.Where(p => p.Type != Constants.Type1).ToList(); 

現在我必須動態創建where查詢,其中我可以有更多的子句來過濾數據。

所以上面的代碼修改後的版本是

List = Details.Where(p => p.Type != Constants.Type1 && p.Type != Constants.Type2).ToList(); 

請指點我如何在C#實現這個

+0

不確定asp.net是如何關聯的? – gideon

回答

3
var ExcludedTypes = new Type[] { Constants.Type1, Constants.Type2 }; 
List = Details.Where(p => !ExcludedTypes.Contains(p.Type)).ToList(); 
2

您只需撥打Where多次(記住,這將不會影響你調用它的查詢;只是返回值)。例如:

var query = Details.Where(p => p.Type != Constants.Type1); 
if (avoidType2) 
{ 
    query = query.Where(p => p.Type != Constants.Type2); 
} 
List = query.ToList(); 

編輯:請注意,我會用這種方法來通用動態過濾。如果你總是想按類型過濾,而這只是有效類型的變化列表,那麼我會用George的方法。

+0

但在你的代碼中,它不會迭代兩次1來檢查type1,然後再次檢測type2。我不能一次性做到這一點嗎? – Amit

+0

@Amit:不,它不會。 * exact *行爲將取決於您的提供者(例如,LINQ to SQL vs LINQ to Objects),但* logical *結果是每個篩選器依次*應用於查詢返回的每個項目。請注意,由於LINQ的惰性,「Where」調用本身並不執行迭代。 –

+0

所以你的意思是當你做「List = query.ToList();」在你的代碼中,實際的過濾是在哪裏完成的,而不是我們稱之爲「where」方法的地方? – Amit