我有一个简单的选择:
这项工作:
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);
使用变量时,它不会返回。
知道吗?
是否针对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_name
与UserName
的值不同),则它将永远不会检查密码-这没有意义。如果"and"的第一部分为false,则评估所有运算符的结果为false。如果您决定检查密码,请交换usr_name和密码检查的顺序,将&&
更改为&
,或者确保x.usr_name
的计算结果为"true"