LINQ to Entities和null字符串

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 Emailstring Name).有些用户没有设置电子邮件地址,所以对于a PasswordRequest request,request.Emailnull.

这是问题所在.这非常好用:

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电子邮件条目).

但是,当这个总是返回一个空集enull:

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与任何内容进行比较.

  • 好的,找到它,似乎在一些较新版本的EF中修复:http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1015361-不正确装卸-的无效变量功能于哪里-CL?REF =标题%23suggestion-1015361 (3认同)