2009-06-17 54 views
5

假設我們有如下表:有條件多個字段搜索和過濾在LINQ

Person: 
    PersonID, 
    Name, 
    Age, 
    Gender 

而且我們提供的搜索功能,使用戶能夠根據名稱和/或的搜索表年齡。

編寫SQL(或LINQ)查詢的棘手部分是用戶可以選擇同時搜索字段或任何一個字段,或者不搜索字段。如果他想搜索全部,那麼他只需要將文本框留空。

做到這一點的邏輯可以寫成如下:

現在後而得到的代碼很長,凌亂......我怎麼能壓縮到上述單一查詢與沒有如果-else?這是我在SQL可能在LINQ的實施已經使用

回答

4

一種選擇太是

var p = from p in Person 
     where p.Name == Name_TextBox || Name_TextBox == String.Empty 
     select p; 

(請注意,您的「LINQ」是使用SQL語法,這將不會編譯。您也可以不聲明爲你不直接分配一個值做一個VAR)

+0

上我已經更新了代碼 – Graviton 2009-06-17 09:33:09

9

嘗試這樣的代碼

 string personName = txtPersonName.Text; 
     int personAge = Convert.ToInt32(txtAge.Text); 
     var opportunites = from p in this.DataContext.Persons 
          select new 
          { 
           p.PersonID, 
           p.Name, 
           p.Age, 
           p.Gender 
          }; 

     if (personsID != 0) 
      opportunites = opportunites.Where(p => p.PersonID == personID); 

     if (personName != string.Empty) 
      opportunites = opportunites.Where(p => p.Name.StartsWith(personName)); 

     if (personAge != 0) 
      opportunites = opportunites.Where(p => p.Age == personAge); 

這將正常工作。如果沒有給出personName,它將不會被添加到哪裏,如果給定,那麼它將被添加。

+0

這是更好的答案迄今。 – Malcolm 2009-06-17 09:41:23

2

爲什麼不使用空合併運算符?例如。

var products = from a in context.products where a.ID == (productID ?? a.ID) select a;

這個作品真的很好我的系統