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

时间:2013-02-18 21:01:14

标签: c# lambda null entity

我有一个简单的选择:

这有效:

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);

使用变量,它不会返回。

任何想法?

3 个答案:

答案 0 :(得分:2)

您是在针对SQL Server数据库运行吗?您是否可以访问SQL Server Profiler?

我认为看看正在执行的SQL会告诉你很多。例如,如果将Password作为参数传递(我相信它会),则将其与列password进行比较,并使用简单的" =&#34 ;?这总是会返回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)
);

答案 1 :(得分:1)

可以在本文中找到详细说明:NULL Value Handling in Entity Framework。请注意,EF 5.0,6.0和6.1可以不同的方式处理可空值。在EF 5.0中,您需要手动测试空值,如上面的答案;默认情况下,两个变量之间的等式比较不测试空值。您还可以在 DbContext.ContextOptions 中手动打开 UseCSharpNullComparisonBehavior 属性以获得相同的效果。在EF 6.0中,默认情况下启用空比较,但可能过于积极甚至在非可空列上,导致性能降低。 EF 6.1应该将算法调整为仅在真正需要时测试空值。

答案 2 :(得分:0)

&&运算符是'早期终止'运算符。这意味着如果第一个条件的结果为false(即,usr_nameUserName的值不同),那么永远不会检查密码 - 没有意义。如果'和'的第一部分为假,则评估所有运算符的结果为false。如果您决定检查密码,请交换usr_name和密码检查的顺序,将&&更改为&或确定x.usr_name评估为'true'