4

一意のコードを生成するための非常に単純なヘルパー メソッドがあります。コードが一意であることを確認するために、LINQ to Entities クエリを実行して、まだ使用されていないことを確認します。

このメソッドを書く最初の試みは完璧に機能しました:

public string GenerateUniqueSignUpCode()
{
    while( true )
    {
        var code = Path.GetRandomFileName().Substring( 0, 6 ).ToUpper();
        if( !Context.Users.Any(e => e.SignUpCode.ToUpper() == code) )
            return code;
    }
}

ただし、R# は LINQ 式を簡略化できることを示唆しており、その結果、次の方法が生まれました。

public string GenerateUniqueSignUpCode()
{
    while( true )
    {
        var code = Path.GetRandomFileName().Substring( 0, 6 ).ToUpper();
        if( Context.Users.All(e => e.SignUpCode.ToUpper() != code) )
            return code;
    }
}

この書き換えにより、無限ループが発生します。コードの実行時にデータベースに 6 文字のコードが含まれていないため、最初の試行でループを終了する必要があります (最初に示した方法と同様)。

EF 4.3.1ですべてが壊れていますか、それとも何が起こっていますか?

4

2 に答える 2

4

私の推測ではSignupCode、任意のエントリで null の場合にこれが発生します。を使用した比較!=では「真」の結果が得られないため、All偽が返されます。

あくまでも推測ですが、以前見たようなものです。あなたは試すことができます:

if (Context.Users.All(e => e.SignUpCode == null ||
                           e.SignUpCode.ToUpper() != code))
于 2012-04-25T10:52:58.837 に答える
0

Context.Users.All(e => e.SignUpCode.ToUpper() != code SignUpCodeがnullの場合、null参照例外をスローする必要があります。

表現は大丈夫だと思います。背後にあるデータに問題があるはずです

于 2012-04-25T11:32:41.297 に答える