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

本文关键字:比较 不起作用 null 表达式 框架 +Lambda 实体 | 更新日期: 2023-09-27 17:59:52

我有一个简单的选择:

这项工作:

User = ent.e_user.FirstOrDefault(x => x.usr_name == UserName && x.password == null);

即使var密码等于空

这不起作用:

String Password = null;
if(Password == null)
{
 //it enters here
}
    User = ent.e_user.FirstOrDefault(x => x.usr_name == UserName && x.password == Password);

使用变量时,它不会返回。

知道吗?

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

是否针对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对可为null值的处理方式不同。在EF 5.0中,您需要像上面的答案一样手动测试null;默认情况下,两个变量之间的方程式比较不会测试null。您也可以在DbContext.ContextOptions中手动启用UseCSharpNullComparisonBehavior属性以实现相同的效果。在EF 6.0中,默认情况下会启用null比较,但可能过于激进,甚至在不可为null的列上,这会导致性能下降。EF 6.1应该已经调整了算法,只在真正需要的时候测试null。

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