Comment ignorer convertir en nullable dans les expressions lambda?

c# expression expression-trees linq-expressions

Question

J'essaie de créer un analyseur d'expressions pour Odata et j'obtiens une erreur lorsque le champ est nullable.

public class UserRight
{
    public bool? active
}

public void Test(){
    Expression<Func<UserRight, bool>> expression = p => p.Active == true;
}

Il me génère l'expression suivante:

{p => (p.Active == Convert(True, Nullable`1))}

Mais j'aimerais bien le recevoir comme

{p => (p.Active == True)}

Afin d'éviter ce "Convertir". Y a-t-il un moyen facile de faire ça? Parce que mon analyseur est prêt et que je ne voudrais pas le reconstruire simplement à cause d'un champ nullable.

Réponse acceptée

Non, il n'y a aucun moyen de l'éviter. L'opérateur que vous appelez accepte un bool? , pas un bool , et donc l'argument doit être un bool? sinon il ne pourrait pas compiler. Il y a une conversion implicite de bool en bool? et cela se voit depuis l'expression convert. Sans cette conversion implicite, ce ne serait pas une expression valide.

Vous pouvez théoriquement construire manuellement votre propre expression qui utilise une valeur constante booléenne nullable, mais il n’est pas possible de faire en sorte que lambda génère "automatiquement" une telle expression, et essayer de créer cette nouvelle expression est presque certainement plus difficile votre fournisseur de requête gère l'expression de conversion.


Réponse populaire

Honnêtement, je n'aime pas Nullable dans les attributs booléens, mais plutôt pour vous satisfaire:

Expression<Func<UserRight, bool>> expression = p => p.Active ?? false

Cela considérerait les nulls comme faux et résoudrait votre cas.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi