LINQ to Entities:所有方法都没有产生预期的结果

时间:2012-04-25 10:49:05

标签: c# entity-framework entity-framework-4 linq-to-entities

我有一个非常简单的辅助方法来生成唯一代码。为确保代码是唯一的,我执行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中的所有内容是否已损坏或正在发生什么?

2 个答案:

答案 0 :(得分:4)

我的猜测是,如果任何条目的SignupCode为空,就会发生这种情况。使用!=的比较不会给出“真实”结果,因此All将返回false。

只是一个猜测,但这是我以前见过的那种东西。你可以尝试:

if (Context.Users.All(e => e.SignUpCode == null ||
                           e.SignUpCode.ToUpper() != code))

答案 1 :(得分:0)

Context.Users.All(e => e.SignUpCode.ToUpper() != code 如果SignUpCode为null,则应抛出null引用异常。

我猜表达式都很好。背后的数据应该有问题