[英]Entity framework + Lambda expression null comparison not working
我有一個簡單的選擇:
這工作:
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);
使用變量,它不會返回。
任何想法?
您是否針對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可以不同的方式處理可空值。 在EF 5.0中,您需要手動測試空值,如上面的答案; 默認情況下,兩個變量之間的等式比較不測試空值。 您也可以手動打開UseCSharpNullComparisonBehavior財產在DbContext.ContextOptions來達到同樣的效果。 在EF 6.0中,默認情況下啟用空比較,但可能過於積極甚至在非可空列上,導致性能降低。 EF 6.1應該將算法調整為僅在真正需要時測試空值。
&&
運算符是“早期終止”運算符。 這意味着如果第一個條件的結果為false
(即, usr_name
與UserName
值不同),那么它將永遠不會檢查密碼 - 沒有意義。 如果'和'的第一部分為假,則評估所有運算符的結果為false。 如果您決定檢查密碼,請交換usr_name和密碼檢查的順序,將&&
更改為&
或命名,確保x.usr_name
計算結果為'true'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.