繁体   English   中英

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

[英]String comparison throws null reference exception

我试图在我的数据库中找到一个用户,搜索电子邮件和电话号码。 但是,如果我使用List或IEnumerable,则会收到null引用异常。 如果我不使用其中任何一个,则会引发“ 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");
}

怎么会这样?

在第一种情况下,您将对一个为null的对象调用Equals()。

x.email.Equals(...)

这引发了异常。

在第二种情况下,您正在比较两件事,其中之一可能为null

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

这可能是因为x.email为null。 如果为null,则调用它的成员将引发异常。

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

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

x.email == email      ==> OK.

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

尝试:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM