1

私は簡単な選択があります:

これは機能します:

User = ent.e_user.FirstOrDefault(x => x.usr_name == UserName && x.password == null);

varPasswordが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プロファイラーにアクセスできますか?

実行されているSQLを見ると、多くのことがわかると思います。たとえば、Passwordがパラメータとして渡された場合(私が信じているように)password、単純な「=」の列と比較されますか?それは常にfalseを返します。

SET @1 = Null;
SELECT *
FROM   table
WHERE  password = @1;

password...すべてのレコードにnullフィールド がある場合でも、レコードが返されることはありません。

あなたはこのようなことを試すことができます:

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

詳細な説明は、この記事「EntityFrameworkでのNULL値の処理」にあります。EF 5.0、6.0、および6.1はnull許容値を異なる方法で処理することに注意してください。EF 5.0では、上記の答えのようにnullを手動でテストする必要があります。2つの変数間の方程式の比較では、デフォルトではnullをテストしません。DbContext.ContextOptionsでUseCSharpNullComparisonBehaviorプロパティを手動でオンにして、同じ効果を実現することもできます。EF 6.0では、null比較はデフォルトでオンになっていますが、おそらく過度に積極的であり、null許容でない列でも、パフォーマンスが低下します。EF 6.1は、本当に必要な場合にのみnullをテストするようにアルゴリズムを微調整したはずです。

于 2014-07-09T18:50:41.537 に答える
0

&&演算子は「早期終了」演算子です。つまり、最初の条件の結果がfalse(つまり、usr_nameと同じ値ではないUserName)の場合、パスワードはチェックされません。意味がありません'と'の最初の部分がfalseの場合、すべての演算子を評価した結果はfalseです。パスワードをチェックすることにした場合は、usr_nameとパスワードチェックの順序を入れ替えるか、に変更する&&か、 「true」と評価される&名前を確認してください。x.usr_name

于 2013-02-18T21:09:25.737 に答える