字符串比较会抛出空引用异常

KLI*_*M8D 0 c# linq compare linq-to-sql

我想在我的数据库中找到一个用户,搜索电子邮件和电话号码.但是,如果我使用List或IEnumerable,我会得到一个空的refence异常.如果我不使用任何这些,则抛出"不支持SQL ...".

我的方法:

public List<tblMember> getAllMembers()
{
    return db.tblMembers.ToList();
}

private void confirmMembership(string email, int phoneNumber)
{
    //var allMembers = db.tblMembers.AsEnumerable(); throws same exception
    tblMember member = getAllMembers().FirstOrDefault(x => x.email.Equals(email, StringComparison.OrdinalIgnoreCase) && x.phoneNumber == phoneNumber); //This line throws exception, around email.Equals()
    if (member != null)
    {
        member.isConfirmed = true;
        db.SubmitChanges();
    }
    else
        throw new Exception("Member not found");
}
Run Code Online (Sandbox Code Playgroud)

如果我执行这样的搜索,则不会抛出异常:

private void confirmMembership(string email, int phoneNumber)
{
    //var allMembers = db.tblMembers.AsEnumerable(); throws same exception
    tblMember member = getAllMembers().FirstOrDefault(x => x.email == email && x.phoneNumber == phoneNumber);
    if (member != null)
    {
        member.isConfirmed = true;
        db.SubmitChanges();
    }
    else
        throw new Exception("Member not found");
}
Run Code Online (Sandbox Code Playgroud)

怎么会这样?

Hog*_*gan 6

在第一种情况下,您在一个null的对象上调用Equals().

x.email.Equals(...)
Run Code Online (Sandbox Code Playgroud)

这引发了一个例外.

在第二种情况下,您要比较两个可能为空的东西

x.email == email
Run Code Online (Sandbox Code Playgroud)

以下是基于评论的最新信息:

private void confirmMembership(string email, int phoneNumber)
{
    tblMember member = tblMembers.FirstOrDefault((x) => {
        if (x.email == null)  return false;
        return SqlMethods.Like(x.email,email) && x.phoneNumber == phoneNumber); 
      }
    if (member != null)
    {
        member.isConfirmed = true;
        db.SubmitChanges();
    }
    else
        throw new Exception("Member not found");
}
Run Code Online (Sandbox Code Playgroud)

这是另一种不会抛出异常的方法:

private void confirmMembership(string email, int phoneNumber)
{
    //var allMembers = db.tblMembers.AsEnumerable(); throws same exception
    tblMember member = getAllMembers().FirstOrDefault((x) => {
        if (x.email == null)  return false;
        return x.email.Equals(email, StringComparison.OrdinalIgnoreCase) && x.phoneNumber == phoneNumber); 
      }
    if (member != null)
    {
        member.isConfirmed = true;
        db.SubmitChanges();
    }
    else
        throw new Exception("Member not found");
}
Run Code Online (Sandbox Code Playgroud)