2016-01-08 39 views
0

我試圖實現搜索功能,但遇到問題時,有些字段未由用戶填寫。Linq跳過查詢,如果字符串爲空

string country = searchCountry.Text.ToLower(); 
string state = searchState.Text.ToLower(); 

var searchLocation= (from h in db.Locations where (!string.IsNullOrWhiteSpace(country) ? h.Country.ToLower().Contains(country):false) 
       && (!string.IsNullOrWhiteSpace(state) ? h.State.ToLower().Contains(state) : false) 
       select h); 

的問題是,當字符串之一是空的searchLocation返回任何內容並只能當兩個字段填寫。我曾嘗試更換& &與||但是它會得到結果,即使其中一個搜索項不在數據庫中。

有沒有辦法做到這一點,除了Filtering out null values in a linq search

+0

你有什麼反對*在linq搜索過濾出空值*? –

+0

@Gert我沒有什麼反對過濾空值,我只是希望有一種方法可以在一個語句中執行,而不是多個if語句。 – Question

+0

組合查詢的優點是SQL語句可以更小並且不包含不必要的元素。 –

回答

0

這將返回國家爲空或其匹配的任何位置,並且狀態爲空或匹配。

var searchLocation= (from h in db.Locations 
        where (string.IsNullOrWhiteSpace(country) || h.Country.ToLower().Contains(country)) 
          && (string.IsNullOrWhiteSpace(state) || h.State.ToLower().Contains(state)) 
        select h); 

這將有助於更多地描述你想要放入和放出什麼,但這對我來說似乎合乎邏輯。

任何一個字段都是可選的,但它會過濾結果以包含匹配全部(一個或兩個)填充字段的任何內容。

當然,如果你運行這個沒有任何過濾器,它會返回所有位置。因此,如果您向數據庫發出請求,請記住這一點。如果這是所期望的行爲,那麼事先將所有數據拉到列表中,而不是在每次輸入任何內容時都要查詢。

+0

謝謝,完美的作品,我只需要記住添加檢查,如果所有的過濾器都是空的。 – Question

+0

@ user2974900是的,我可能只是在外面做,就像一些人在'if'塊中提到的那樣。我不知道這是不是你的意思,但你*可以*把它放在查詢本身,但這將是不必要的開銷。 –

0

我相信你這個得太多。只需在搜索前驗證字段:

string country = searchCountry.Text.ToLower(); 
string state = searchState.Text.ToLower(); 

if(string.IsNullOrWhitespace(state) || string.IsNullOrWhitespace(country)) 
{ 
    //MessageBox.Show... 
    return; 
} 

var searchLocation= //query with validated fields 

在嘗試對它執行操作之前驗證輸入是一個非常好的主意。它使您的代碼比結合兩者更具可讀性。