2012-06-07 33 views
1

在我看來,有一個數據表包含一個ServerRow和4個文本框(主機名,操作系統,位置,區域)的集合。當用戶輸入4個框中的任何一個時,我想立即過濾這個列表。我有這樣的代碼設置,並準備在每個文本框屬性的設置方法上使用過濾方法。用Linq和多個條件過濾集合

現在的問題:如果我有4個標準,這意味着我有2個權力的4個不同的場景。我想要做的是寫一個linq語句處理所有這些場景,以便如果任何屬性爲NullOrEmpty,則它們將不會用於Where子句中,而在另一側如果有相應的字段值用Contains進行搜索。

AvailableCis = New ObservableCollection(Of ServerRow) 
       (_CiData.Where(Function(ci) ci.OS.ToUpper 
       .Equals(_selectedOS.ToUpper) AndAlso 
       ci.HostName.ToUpper.Contains(_ciNameFilterText.ToUpper)) 
       .OrderBy(Function(a) a.CiName)) 

這個例子顯示了它的工作原理與2個標準和二者的那些條件被設置。

回答

1

您可以使用懶人評估來解決這個問題 - 如果字符串爲null

String.IsNullOrEmpty(ci.OS) OrElse ci.OS.ToUpper.Equals(_selectedOS.ToUpper) 

這樣或清空第二子句不評估,所有ServerRows被接受。

另外不要忘記,AndAlso具有比OrElse更高的優先級,所以每個子句都必須用括號括起來。