一意のコードを生成するための非常に単純なヘルパー メソッドがあります。コードが一意であることを確認するために、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ですべてが壊れていますか、それとも何が起こっていますか?