hyd*_*dic 15 c# sql-server asp.net linq-to-entities entity-framework
我使用EF 4.0作为其数据库后端在ASP.NET 4.0 Web应用程序上发生了一件非常奇怪的事情.从本质上讲,我有一个存储用户的密码重置请求(包含类型的复位键的表中byte[]
,类型的到期DateTime
,以及一个外键,一个User
包含string Email
和string Name
).有些用户没有设置电子邮件地址,所以对于a PasswordRequest request
,request.Email
是null
.
这是问题所在.这非常好用:
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;
Run Code Online (Sandbox Code Playgroud)
我得到预期的结果数量(非零,因为有null
电子邮件条目).
但是,当这个总是返回一个空集e
是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;
Run Code Online (Sandbox Code Playgroud)
我必须正常工作(这在逻辑上没有任何意义)是这样的:
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;
Run Code Online (Sandbox Code Playgroud)
我绝对难过.有任何想法吗?
Jon*_*eet 35
基本上,当处理空值时,这是SQL和C#之间的不匹配.您不需要使用两个查询,但您需要:
where r.User.Name == u && (r.User.Email == e ||
(e == null && r.User.Email == null))
Run Code Online (Sandbox Code Playgroud)
这很麻烦,并且可能有一个辅助函数可以让生活更轻松,但它从根本上来自SQL的null处理
where X = Y
Run Code Online (Sandbox Code Playgroud)
将不匹配,如果X和Y都为null.(而在C#中,等效表达式将是真实的.)
u
除非在数据库中不可为空,否则您可能也需要执行相同的操作.
如果你对null和空字符串的处理方式相同,你可以至少尝试一个小技巧:
// Before the query
e = e ?? "";
// In the query
where r.User.Name == u && (r.User.Email ?? "") == e
Run Code Online (Sandbox Code Playgroud)
我相信它会在电子邮件列上执行空合并e
,因此您永远不会最终将null与任何内容进行比较.
归档时间: |
|
查看次数: |
12488 次 |
最近记录: |