12
votes

Opérateur '&&' ne peut pas être appliqué aux opérandes de type 'Bool' et 'Bool?'

essayer de lire une classe DataContext comme celle-ci xxx

de sorte que la question est de savoir où la clause que j'ai besoin d'obtenir des utilisateurs qui sont en rôle (1,2) && isvalid == vrai, si isvalid est 'null' le rendre faux. Merci


1 commentaires

Vous devez supprimer la possibilité d'une nulle de chaque côté de l'opérande, que vous le faites en l'enveloppant entre parenthèses ou par une autre méthode ->. Où (u => rôles.Contains (u.roléid.value) && u. isvalid == True) devrait également fonctionner.


3 Réponses :


2
votes

Vous pouvez essayer comme ça. XXX PRE>

ou P>

foreach (var user in dataContext.Users
       .Where(u => roles.Contains(u.RoleID.Value) 
        && (u.isValid.HasValue && u.isValid))) //you can use HasValue to check for null


6 commentaires

Merci @ sudhansu63, mais je ne veux pas filtrer où u.isvalid == null. Je veux obtenir des enregistrements où u.isvalid == true et si u.isvalid est null, (pour éviter de compiler une erreur, convertir ceci en null en faux)


mais ne renvoyez que des enregistrements où u.isvalid == true


J'ai mis à jour ma réponse (2ème One). 1stone travaillait déjà comme prévu.


Merci, qu'est-ce que cela signifie dans votre 1ère réponse (u.isvalid? je veux


opérateur null-coalescent. Il renvoie l'opérande de gauche si l'opérande n'est pas nul; Sinon, il retourne l'opérande à droite.


@sky: Non, cela ne signifie pas rechercher les utilisateurs où u.isvalid est faux. Tout comme si (u.isvalid) recherche des utilisateurs où u.isvalid est vrai, si (u.isvalid ?? false) signifie " Rechercher des utilisateurs où u.isvalid est vrai (et traitez NULL de la même manière que false) "C'est tout le ?? fait, il fournit une instruction pour traiter NULL le même que une autre valeur. Cela n'inversion pas la signification globale d'une condition de filtrage.



32
votes

Vous devez l'envelopper entre parenthèses: xxx pré>

peu de confus avec (u.isvalid ?? faux), n'est-ce pas que si u.isvalid == null puis faites-la fausse et cherche des utilisateurs où u.isvalid est faux, ce n'est pas ce que je veux. P> blockquote>

non, cela signifie simplement que nulls code> est traité comme false code> et que tous les utilisateurs sont pris quel isvalid code> n'est ni null code> ni false code>. Cela fonctionne car le ?? code> -OPérateur convertit le nullable code> sur un bool code>, vous pouvez donc l'utiliser avec && . Je n'aime pas cela, je préfère le code explicite que je comprends plus tard: p> xxx pré>

ou plus simple en utilisant le == code> -opérateur avec le BOOL? CODE>: P>

roles.Contains(u.RoleID.Value) && u.isValid == true


4 commentaires

Mais perdre le == true


Merci tim. Cela signifie filtrer si u.isvalid == true et si u.isvalid est null filtre u.isvalid == faux. Est-ce exact?


Si cela est correct, je ne veux pas ce comportement, je veux revenir seulement si Isvalid == True. Étant donné que Isvalid est nullable, je voulais le rendre faux d'éviter les erreurs et ne renvoie que des enregistrements où Isvalid est vrai.


Un peu de confus avec (u.isvalid?



7
votes

donné bool sur false de toute façon que vous pouvez utiliser getvalueordfault xxx

note - getvalueordfault n'apparaît pas être pris en charge par ef - Voir ticket


5 commentaires

Ceci est particulièrement agréable, car getvalueordfault () est un champ nu en lecture sans logique supplémentaire.


getvalueordfault () n'est pas traduit en SQL par l'entitéFramework


@Alexg qui était le seul doute dans mon esprit - pouvez-vous confirmer que c'est certainement le cas?


Voici le billet d'émission


@Alexg Merci, cependant, la question elle-même est plus liée à l'erreur du compilateur plutôt qu'à l'exécution que celle qui serait lancée par EF (bien que, finalement, cela soit le cas si l'OP utilise ce code). Je laisserai la réponse, mais mettez à jour simplement pour souligner que le soutien semble toujours manquer à EF (bien que je pense que cela est soutenu par L2S).