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

时间:2012-08-19 20:57:28

标签: c# linq linq-to-sql compare

我正在尝试在我的数据库中查找用户,搜索电子邮件和电话号码。 但是,如果我使用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");
}

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

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");
}

这怎么可能?

3 个答案:

答案 0 :(得分:6)

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

x.email.Equals(...)

这引发了异常。

在第二种情况下,您要比较其中一项可能为空的两件事

x.email == email

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

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");
}

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

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");
}

答案 1 :(得分:3)

这可能是因为x.email为空。如果为null,则调用其成员会抛出异常。

x.email.Equals(...)   ==> exception

但是,您可以比较两个可能为null的值

x.email == email      ==> OK.

答案 2 :(得分:3)

我怀疑是因为x.email对于x的某个值为空。

尝试:

tblMember member = db.tblMembers
     .FirstOrDefault(x => x.email != null
                     && x.email.Equals(email, StringComparison.OrdinalIgnoreCase) 
                     && x.phoneNumber == phoneNumber);

编辑:我刚才注意到getAllMembers()返回List<T>所以你不必担心我之前谈论的表达式树转换 - 但是你当前的代码正在获取<每次调用此方法时,em> all 数据库中的数据。你真的想要吗?我上面提供的代码将在数据库中进行过滤,这肯定是你感兴趣的。