LINQ to entities et des chaînes vides
J'en ai assez d'une chose étrange qui se passe sur un ASP.NET 4.0 application web à l'aide de EF 4.0 en tant que sa base de données back-end. Essentiellement, j'ai une table qui stocke les utilisateurs les demandes de réinitialisation de mot de passe (contenant une clé de réinitialisation de type byte[]
, une échéance de type DateTime
, et une clé étrangère vers une User
contenant un string Email
et string Name
). Certains utilisateurs n'ont pas une adresse e-mail, donc pour un PasswordRequest request
, request.Email
est null
.
Voici le problème. Cela fonctionne parfaitement bien:
string u = Request["u"];
string e = Request["e"];
var requests = from r in context.PasswordRequests
where r.User.Name == u && r.User.Email == null && r.Expiry >= DateTime.Now
select r;
- Je obtenir le nombre de résultats (différente de zéro, car il y a des entrées avec null
e-mails).
Mais cela renvoie toujours un vide collection lors de la e
est null
:
string u = Request["u"];
string e = Request["e"];
var requests = from r in context.PasswordRequests
where r.User.Name == u && r.User.Email == e && r.Expiry >= DateTime.Now
select r;
La seule chose que j'ai eu à travailler correctement (ce qui n'est pas logiquement aucun sens) est-ce:
string u = Request["u"];
string e = Request["e"];
IQueryable<PasswordRequest> requests;
if (e == null)
requests = from r in context.PasswordRequests
where r.User.Name == u && r.User.Email == null && r.Expiry >= DateTime.Now
select r;
else
requests = from r in context.PasswordRequests
where r.User.Name == u && r.User.Email == e && r.Expiry >= DateTime.Now
select r;
Je suis absolument perplexe. Des idées?
En effet il est.
Pouvez-vous poster le code sql généré?
OriginalL'auteur hydroiodic | 2011-11-11
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, c'est un décalage entre SQL et C# quand il s'agit de la gestion des valeurs null. Vous n'avez pas besoin d'utiliser deux requêtes, mais vous avez besoin de:
C'est ennuyeux, et il peut y avoir une fonction d'assistance pour rendre la vie plus facile, mais, fondamentalement, vient de SQL null manipulation de
sera pas match si X et Y sont nulles. (Alors qu'en C# l'expression équivalente qui serait vrai.)
Vous devrez peut-être faire de même pour
u
ainsi, sauf que c'est pas les valeurs null dans la base de données.Un petit truc, tu pourrais au moins essayer si vous êtes heureux avec la valeur null et des chaînes vides être traitées de la même manière est:
Je crois que va effectuer null échangeons sur à la fois la colonne email et
e
, de sorte que vous ne jamais en comparant les valeurs null avec quoi que ce soit.+1 pour la compréhension rapide et répondant à
Bien fait! La condition est un peu lâche. Donc je suppose que la mise dans toutes les trois valeurs possibles pour
e
sens.J'ai eu un problème où ma base de données contenait une colonne INT qui a permis à des valeurs nulles, de sorte que les autres solutions ne fonctionnent pas pour moi (la plupart des solutions de traiter des chaînes de caractères) - votre dernier code a sauvé ma vie! merci! Voici ce que j'ai utilisé: (w.AccountID ?? _AccountID) == _AccountID
Ok, trouvé, et il semble être fixe dans certaines versions les plus récentes de l'EF: data.uservoice.com/forums/...
OriginalL'auteur Jon Skeet
J'ai trouvé quelques articles détaillant la même question. Malheureusement, je n'ai pas été confronté à ce problème jusqu'à présent. Il est très intéressant, bien que.
Ici:
La syntaxe LINQ où la chaîne de valeur n'est pas null ou vide
LINQ to SQL et des chaînes vides, comment puis-je utiliser Contient?
Et à partir de MSDN: http://msdn.microsoft.com/en-us/library/bb882535.aspx
OriginalL'auteur Hassan Gulzar
Si vous préférez l'aide de la méthode (lambda) de la syntaxe comme je le fais, vous pouvez le faire comme ceci:
OriginalL'auteur John Meyer
Si vous voulez récupérer des éléments de la DB lors de la demande de['e'] == null
il doit avoir été
noter que == null et is null est différent . voir --> MSDN Info
Par conséquent, votre dernier exemple est une sorte de valide, car vous avez besoin de 2 façons d'obtenir des données de la DB. c'est à dire si un email est nulle et si un e-mail == Request['e']
OriginalL'auteur Jonathan