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 中的 All 是否损坏或发生了什么?

4

2 回答 2

4

SignupCode我的猜测是,如果任何条目为空,就会发生这种情况。比较使用!=不会给出“真”结果,因此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 为空,则应抛出空引用异常。

我想表达一切都很好。后面的数据应该有问题

于 2012-04-25T11:32:41.297 回答