Requête LINQ ignorer les paramètres vides
-
30-09-2019 - |
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
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:
- Seulement
ret = parent.ToLower.StartsWith(value2compare.ToLower.Trim)
pourrait revenir vrai. -
value2compare.ToLower.Trim()
certainement la cause du problème que vous indiquez. -
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:
solutionbasé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