[英]Entity framework + Lambda expression null comparison not working
我有一个简单的选择:
这工作:
User = ent.e_user.FirstOrDefault(x => x.usr_name == UserName && x.password == null);
即使var Password等于null
这不起作用:
String Password = null;
if(Password == null)
{
//it enters here
}
User = ent.e_user.FirstOrDefault(x => x.usr_name == UserName && x.password == Password);
使用变量,它不会返回。
任何想法?
您是否针对SQL Server数据库运行? 您是否可以访问SQL Server Profiler?
我想看看正在执行的SQL会告诉你很多。 例如,如果Password
作为参数传递(我相信它会是),它与列password
比较简单的“=”? 这将总是返回false,因为
SET @1 = Null;
SELECT *
FROM table
WHERE password = @1;
...永远不会返回任何记录,即使每个记录都有一个空password
字段。
你可以尝试这样的事情:
User = ent.e_user.FirstOrDefault(
x => x.usr_name == UserName &&
(x.password == Password || (x.password == null && Password == null)
);
可以在本文中找到详细说明: 实体框架中的NULL值处理 。 请注意,EF 5.0,6.0和6.1可以不同的方式处理可空值。 在EF 5.0中,您需要手动测试空值,如上面的答案; 默认情况下,两个变量之间的等式比较不测试空值。 您也可以手动打开UseCSharpNullComparisonBehavior财产在DbContext.ContextOptions来达到同样的效果。 在EF 6.0中,默认情况下启用空比较,但可能过于积极甚至在非可空列上,导致性能降低。 EF 6.1应该将算法调整为仅在真正需要时测试空值。
&&
运算符是“早期终止”运算符。 这意味着如果第一个条件的结果为false
(即, usr_name
与UserName
值不同),那么它将永远不会检查密码 - 没有意义。 如果'和'的第一部分为假,则评估所有运算符的结果为false。 如果您决定检查密码,请交换usr_name和密码检查的顺序,将&&
更改为&
或命名,确保x.usr_name
计算结果为'true'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.