Linq Query忽略空参数

时间:2010-04-20 19:04:26

标签: .net vb.net linq linq-to-xml xelement

如何让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 个答案:

答案 0 :(得分:1)

只是为了确保我理解你想要的东西:你想要一个IEnumerable的XElements x返回,其中至少有一个子元素的值与相应的字符串变量匹配。因此, ignore 表示您的扩展方法将返回 false 。所以我推断如果它不能正常工作,那么一个空参数会导致True(错误地)返回TestPhoneElement,因此会得到误报。意思是,如果一个参数是一个空格或者什么都没有,它总是返回true,因此你得到的结果中的项目是你不应该得到的。

我的想法是:

  1. 只有ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)可能会返回true。
  2. value2compare.ToLower.Trim()肯定会导致您指出的问题。
  3. String.IsNullOrEmpty(value2compare)必须返回false。
  4. 我相信你传入TestPhoneElement的第二个参数实际上必须是一个至少包含一个空格的字符串。这样,{ {1}}返回false。然后在最后一行String.IsNullOrEmpty(value2compare)评估为空字符串,因为你修剪它,value2compare.ToLower.Trim评估为 true ,因为每个字符串开头为空字符串。

    因此,在第一次进入时修剪value2compare,或者将第二个条件更改为:

    ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)

    你应该好。

    编辑:

    基于明确情况的解决方案

    你想要一个空字符串传递给extension方法导致True然后,对吗?此外,我更新了扩展方法,以允许稍微更清晰的代码。关键是你要传入任何空白字符串以返回True:

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

    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