2010-04-20 87 views
2

如何讓LINQ到忽略是空的任何參數?所以姓,名,等等?如果我在所有參數正常工作數據...LINQ查詢忽略空參數

refinedresult = From x In theresult _ 
        Where x.<thelastname>.Value.TestPhoneElement(LastName) And _ 
        x.<thefirstname>.Value.TestPhoneElement(FirstName) And _ 
        x.<id>.Value.TestPhoneElement(Id) And _ 
        x.<number>.Value.TestPhoneElement(Telephone) And _ 
        x.<location>.Value.TestPhoneElement(Location) And _ 
        x.<building>.Value.TestPhoneElement(building) And _ 
        x.<department>.Value.TestPhoneElement(Department) _ 
        Select x 


Public Function TestPhoneElement(ByVal parent As String, ByVal value2compare As String) As Boolean 
'find out if a value is null, if not then compare the passed value to see if it starts with 
Dim ret As Boolean = False 

If String.IsNullOrEmpty(parent) Then 
    Return False 
End If 
If String.IsNullOrEmpty(value2compare) Then 
    Return ret 
Else 
    ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim) 
End If 

Return ret 
End Function 

回答

1

只是爲了確保我知道你想什麼:你想XElements X的IEnumerable返回的子元素相匹配的值,其中至少一個對應字符串變量。因此,通過忽略你的意思是你的擴展方法將返回。因此,我推斷,如果它不做工精細,然後空參數導致真實的(誤)由TestPhoneElement返回,因此你會得到誤報。意思是,如果一個參數是一個空字符串或者什麼也不是,它總是返回true,因此你得到的結果中的項目不應該被獲取。

我的想法是這樣的:

  1. 只有ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)可能可能返回true。
  2. value2compare.ToLower.Trim()肯定會引起你指出問題。
  3. String.IsNullOrEmpty(value2compare)必須返回false。

我相信您傳遞到TestPhoneElement實際上必須在第二個參數是包含至少一個空間的字符串。這樣,String.IsNullOrEmpty(value2compare)返回false。然後在最後一行value2compare.ToLower.Trim評估爲一個空字符串,因爲您修剪它,ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)評估爲true,因爲每個字符串開頭一個空字符串。

因此,修剪value2compare當它第一次進入時,或改變你第二個有條件的:

If String.IsNullOrEmpty(value2compare.trim()) Then 

,你應該是不錯的。

編輯:基於澄清情況

你想傳遞到擴展方法一個空字符串導致True,那麼,正確的

解決方案?另外,我更新了擴展方法以允許稍微更簡潔的代碼。關鍵的是,雖然你想返回傳遞導致真正的任何空字符串:

refinedresult = From x In theresult _ 
      Where x.<thelastname>.MatchesOrIsBlank(LastName) And _ 
       x.<thefirstname>.MatchesOrIsBlank(FirstName) And _ 
       x.<id>.MatchesOrIsBlank(Id) And _ 
       x.<number>.MatchesOrIsBlank(Telephone) And _ 
       x.<location>.MatchesOrIsBlank(Location) And _ 
       x.<building>.MatchesOrIsBlank(Building) And _ 
       x.<department>.MatchesOrIsBlank(Department) _ 
      Select x 

和:

Public Function TestPhoneElement(ByVal xE As XElement, ByVal value2compare As String) As Boolean 
    Return xE.Value.ToLower.StartsWith(value2compare.ToLower.Trim) 
End Function 

+0

我會嘗試感謝你回答。 +1這樣一個很好的詳細的嘗試,我會報告,如果它的工作。再次感謝。 – 2010-04-20 20:07:22

+0

好的,我在代碼中犯了一個錯誤。我真的想要「和」每個參數。當我在試圖讓它工作的時候,我從那裏得到了操作系統。所以最終我目前沒有得到任何結果。 (我更新了問題)我得到結果的唯一時間是如果所有參數都有。所以是的,它與任何參數中的空字符串有關。 – 2010-04-20 20:20:09

+0

那麼,你想* TestPhoneElement *返回真或假在其中* value2compare *參數爲空字符串(或沒有)的情況下? – 2010-04-21 13:04:02