12
votes

Pourquoi ce court-circuit n'est-il pas à Lambda?

Pourquoi Linq tente de vérifier la deuxième expression de toute façon?

.Where(t =>  String.IsNullOrEmpty(someNullString) || t.SomeProperty >= Convert.ToDecimal(someNullstring))


4 commentaires

Je trouve soudainement le => et> = dans ce code très déroutant. :-) (et j'ai utilisé les deux assez souvent, mais jamais ensemble dans la même déclaration.)


Oui. Eh bien, merci, je l'ai eu :)


Êtes-vous sûr que cela ne fonctionne pas? Je l'ai testé sur une liste (Linq aux objets) et semble fonctionner.


Lisez la question à nouveau. Bien sûr, cela fonctionne mais il évalue également la deuxième condition tout en utilisant || aurait dû éviter cela ...


4 Réponses :


-1
votes

Je ne peux reproduire aucun problème avec l'évaluation court-circuit ...

Je pense que cela évalue quelque chose comme: xxx

court-circuit fonctionne bien ici.

Je soupçonne d'autres éléments dans votre énumérable Évaluez la première condition ( string.isnullorempty (Somenullstring) ) à False. Pouvez-vous confirmer cela?

fournir un peu plus de code afin que nous puissions analyser cela.


0 commentaires

11
votes

est le .where utilisé sur une table <> ?

Si tel est ainsi, avant que toutes les données puissent être saisies, il doit convertir la linq en SQL et pour le faire, il doit convertir la chaîne dans un décimal . Il n'essaie pas de réellement effectuer les comparaisons, il tente de construire les constructions nécessaires à la récupération de données.


0 commentaires

-1
votes

Avez-vous une variable t forte> dans n'importe quelle portée qui peut être évaluée?

Avez-vous essayé avec des parenthèses comme ceci: p>

.Where(t =>  (String.IsNullOrEmpty(someNullString) || 
             t.SomeProperty >= Convert.ToDecimal(someNullstring)))


1 commentaires

Le => définit la portée de t.



-1
votes

Il y a une solution de contournement sur the || (ou) l'opérateur de Linq avec C # selon lequel vous feriez dans votre cas quelque chose comme: xxx

Bien sûr, cela pourrait ne pas être la solution dont vous avez besoin dans votre cas particulier, Mais au moins cela donne une idée de savoir comment contourner l'erreur.


0 commentaires