2

空のパラメータを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
4

1 に答える 1

1

必要なものを確実に理解するために、対応する文字列変数に一致する子要素の値の少なくとも1つでXElementsxのIEnumerableを返す必要があります。したがって、無視すると、拡張メソッドがfalseを返すことを意味します。したがって、正常に機能していない場合、空のパラメーターによってTestPhoneElementによってtrueが(誤って)返されるため、誤検知が発生すると推測されます。つまり、パラメータが空の文字列であるか何もない場合、常にtrueが返されるため、取得すべきではない項目が結果に含まれます。

私の考えはこれです:

  1. ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)おそらくtrueを返すことができるだけです。
  2. value2compare.ToLower.Trim()確かにあなたが示す問題を引き起こすでしょう。
  3. String.IsNullOrEmpty(value2compare)falseを返す必要があります。

渡す2番目のパラメーターTestPhoneElementは、実際には少なくとも1つのスペースを含む文字列でなければならないと思います。 このように、String.IsNullOrEmpty(value2compare)falseを返します。次に、最後の行でvalue2compare.ToLower.Trim、トリミングしたために空の文字列と評価され、すべての文字列が空の文字列で始まるため、 trueret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)と評価されます。

したがって、value2compareを最初に入力したときにトリミングするか、2番目の条件を次のように変更します。

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

そして、あなたは良いはずです。

編集:

明確化された状況に基づく解決策

空の文字列をextensionメソッドに渡して、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
于 2010-04-20T19:55:51.743 に答える