繁体   English   中英

实体框架+ Lambda表达式null比较不起作用

[英]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_nameUserName值不同),那么它将永远不会检查密码 - 没有意义。 如果'和'的第一部分为假,则评估所有运算符的结果为false。 如果您决定检查密码,请交换usr_name和密码检查的顺序,将&&更改为&或命名,确保x.usr_name计算结果为'true'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM