Linq Query игнорирует пустые параметры - PullRequest
2 голосов
/ 20 апреля 2010

Как заставить 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 Ответ

1 голос
/ 20 апреля 2010

Просто чтобы убедиться, что я понимаю, что вы хотите: вы хотите, чтобы IEnumerable из XElements x возвращал, где хотя бы одно из значений дочерних элементов соответствует соответствующей строковой переменной. Таким образом, ignore означает, что ваш метод расширения вернет false . Поэтому я делаю вывод, что если он не работает нормально, то пустой параметр приводит к тому, что TestPhoneElement (по ошибке) возвращает true, и, следовательно, вы получаете ложные срабатывания. Это означает, что, если параметр является пустой строкой или ничем, он всегда возвращает 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 , потому что каждая строка начинается с пустой строки.

Таким образом, значение триммера2 сравните, когда оно впервые появится, или измените второе значение на:

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

и тебе должно быть хорошо.

Edit:

решение на основе проясненной ситуации

Вы хотите, чтобы пустая строка, переданная в метод расширения, приводила к True тогда, верно? Кроме того, я обновил метод расширения, чтобы учесть немного более чистый код. Ключевым моментом является то, что вы хотите, чтобы любая пустая передаваемая строка приводила к возвращению 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
...