我有一个简单的选择:
这有效:
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);
使用变量,它不会返回。
任何想法?
答案 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_name
与UserName
的值不同),那么永远不会检查密码 - 没有意义。如果'和'的第一部分为假,则评估所有运算符的结果为false。如果您决定检查密码,请交换usr_name和密码检查的顺序,将&&
更改为&
或确定x.usr_name
评估为'true'