簡體   English   中英

實體框架+ Lambda表達式null比較不起作用

[英]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_nameUserName值不同),那么它將永遠不會檢查密碼 - 沒有意義。 如果'和'的第一部分為假,則評估所有運算符的結果為false。 如果您決定檢查密碼,請交換usr_name和密碼檢查的順序,將&&更改為&或命名,確保x.usr_name計算結果為'true'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM