1

我有一个简单的选择:

这有效:

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

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

任何想法?

4

3 回答 3

3

您是否针对 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)
);
于 2013-02-18T21:31:58.320 回答
2

可以在这篇文章中找到详细的解释:实体框架中的NULL值处理。请注意,EF 5.0、6.0 和 6.1 处理可空值的方式不同。在 EF 5.0 中,您将需要像上面的答案一样手动测试空值;默认情况下,两个变量之间的方程比较不会测试空值。也可以在 DbContext.ContextOptions 中手动开启UseCSharpNullComparisonBehavior属性达到同样的效果。在 EF 6.0 中,默认情况下会打开 null 比较,但可能过于激进,甚至在不可为 null 的列上,这会导致性能下降。EF 6.1 应该对算法进行了调整,只在真正需要时才测试空值。

于 2014-07-09T18:50:41.537 回答
0

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

于 2013-02-18T21:09:25.737 回答