2015-10-20 193 views
1

我想检查用户输入的电子邮件是否已经存在于Office表中,看看我目前为止所做的事情,问题是officeEmail总是如此,即使输入电子邮件不存在,它永远不会返回NULL检查表中是否已经存在字段

public static bool IsOfficeEmail(string email) 
{ 

    using (var data = Database) 
    { 
     data.ObjectTrackingEnabled = false; 
     var officeEmail = data.Offices.Where(a => a.Active && a.Email.Equals(email)); 

     if (officeEmail != null)     
      return true; 
    } 

    return false; 
} 

回答

3

Where将不会返回null,但空序列,将其更改为:

var officeEmail = data.Offices.FirstOrDefault(a => a.Active && a.Email.Equals(email)); 

if (officeEmail != null)     
    return true; 

FirstOrDefault将返回默认值(这里是零)它不会找到查询值。

它是使用Any一个选项,如果你不感兴趣的电子邮件记录:

public static bool IsOfficeEmail(string email) 
{ 
    using (var data = Database) 
    { 
     return data.Offices.Any(a => a.Active && a.Email.Equals(email)) 
    } 
} 

如果你无论如何也不会使用它您将不会收到电子邮件记录。你应该使用哪种方法取决于你如何处理officeEmail,如果你只是查询它是否存在 - >Any将是最好的方法。如果你想检查现有的记录并做一些事情,FirstOrDefault会更好。

+1

为什么赞成'Any'超过'FirstOrDefault'。 +1 – HimBromBeere

+1

谢谢你的回答,也是非常好的解释,因此我可以学到一些东西。 –

+0

@Mystia谢谢,很高兴帮助:) – wudzik

2

Alternativly,如果你真的想使用.Where你也可以检查返回集合包含的任何元素:

if (officeMail.Any()) // ... 

或者更短:

if (officeMail.Any(a => a.Active && a.Email.Equals(email))) // ... 

如果你想确保有恰好与您的条件匹配的列表中的一个项目使用.Single而不是.Any,如果找不到一个或多个项目,将会抛出异常。

您检查所有返回true的实际原因是.Where将返回枚举器,即使没有项目与条件匹配。因此,结果永远不会是null

相关问题