Question

Comment puis-je obtenir LINQ d'ignorer tous les paramètres qui sont vides? Donc, nom, prénom, etc? Si j'ai données dans tous les paramètres, il fonctionne très bien ...

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
Était-ce utile?

La solution

Juste pour vous assurer que je comprends ce que vous voulez: Vous voulez un IEnumerable de XElements x retourné où au moins l'une des valeurs des éléments de l'enfant correspondant à la variable de chaîne correspondante. Donc, par Ignorer vous voulez dire que votre méthode d'extension serait de retour false . Donc, je déduis que si cela ne fonctionne pas bien, alors un paramètre vide provoque à vrai (à tort) être retourné par TestPhoneElement, et par conséquent vous obtenez des faux positifs. Ce qui signifie, si un paramètre est un emptystring ou rien, il retourne toujours vrai, et donc vous obtenez des éléments dans votre résultat que vous ne devriez pas obtenir.

Ma pensée est la suivante:

  1. Seulement ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim) pourrait revenir vrai.
  2. value2compare.ToLower.Trim() certainement la cause du problème que vous indiquez.
  3. String.IsNullOrEmpty(value2compare) doit être soit faux.

Je crois que le second paramètre que vous passez dans le moût de TestPhoneElement en fait être une chaîne contenant au moins un Espace . De cette façon, les rendements String.IsNullOrEmpty(value2compare) faux. Puis, dans les evalue de value2compare.ToLower.Trim ligne finale à une chaîne vide parce que vous PARÉ, et évalue de ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim) à true parce que chaque chaîne commence par une chaîne vide.

Alors, value2compare garniture quand il vient en premier, ou vous changez 2ème conditionnel à:

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

et vous devriez être bon.

Edit:

solution

basée sur la situation clarifiée

Vous voulez une chaîne vide passée dans la méthode d'extension pour aboutir à vrai alors, non? En outre, je mis à jour la méthode d'extension pour permettre le code un peu plus propre. La clé est que si vous voulez une chaîne vide pour passer en résultat vrai retour:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top