2015-06-14 180 views
-1

我正試圖在LINQ中編寫一個搜索查詢。以下是哪裏的條件。LINQ搜索查詢不起作用

where (!string.IsNullOrEmpty(nameWithInitials) 
&& tb.NameWithInitials.Contains(nameWithInitials)) 
&& (!string.IsNullOrEmpty(studentRegNo) 
    && tbSR.StudentRegistrationNo.Contains(studentRegNo)) 
&& (!string.IsNullOrEmpty(NIC) && tb.NIC.Contains(NIC)) 
&& (!string.IsNullOrEmpty(fullName) && tbi.Name.Contains(fullName)) 

如果我傳遞一個參數,它不返回任何值。例如,如果我將'Chamara'作爲全名傳遞,它不會返回任何結果,但如果我傳遞一次所有參數,則會返回匹配的記錄。

我需要當我通過幾個參數動態

+0

什麼應該是結果,如果你不通過任何東西? (我的意思是,所有字符串都是空或空)? – Steve

回答

3

您正在使用AND(&&)無處不在,所以如果這些條件中的至少一個是假的,你where條件將是錯誤的這甚至工作。嘗試使用OR條件,而不是:

where (string.IsNullOrEmpty(nameWithInitials) || tb.NameWithInitials.Contains(nameWithInitials)) 
&& (string.IsNullOrEmpty(studentRegNo) || tbSR.StudentRegistrationNo.Contains(studentRegNo)) 
&& (string.IsNullOrEmpty(NIC) || tb.NIC.Contains(NIC)) 
&& (string.IsNullOrEmpty(fullName) || tbi.Name.Contains(fullName)) 

在這種情況下,任何一個條件,如果你有空參數,只有條件的第一部分將被評估,否則第二個條件進行評估。

一個潛在的問題是實體框架可能無法將其轉換爲實際的SQL。在這種情況下,你可以使用這樣的方法:

var query = // your original query without where condition 
// Check if the condition is valid and only then add where condition 
if(!string.IsNullOrEmpty(nameWithInitials)) 
{ 
    query = query.Where(tb => tb.NameWithInitials.Contains(nameWithInitials)); 
} 
// repeat this for all other conditions 
+0

我在想同樣的事情,但是我的頭腦混雜着所有這些情況! :) – AmmarCSE

+0

EF可以翻譯。但第二種方法更好的可讀性 –

+0

在這裏的OP請求中,有些事情不太正確。如果所有字符串都爲空或空值,結果應該是什麼? – Steve

0

什麼你問的是半混亂,但我認爲你要搜索的每一個是否存在串,轉化爲

where ((string.IsNullOrEmpty(nameWithInitials) 
|| tb.NameWithInitials.Contains(nameWithInitials)) 
&& (string.IsNullOrEmpty(studentRegNo) 
    || tbSR.StudentRegistrationNo.Contains(studentRegNo)) 
&& (string.IsNullOrEmpty(NIC) || tb.NIC.Contains(NIC)) 
&& (string.IsNullOrEmpty(fullName) || tbi.Name.Contains(fullName))