0

メールと電話番号を検索して、データベースでユーザーを見つけようとしています。ただし、List または IEnumerable を使用すると、null 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");
}

どうすればいいの?

4

3 に答える 3

6

最初のケースでは、null のオブジェクトで Equals() を呼び出しています。

x.email.Equals(...)

これは例外をスローします。

2 番目のケースでは、2 つのものを比較しており、そのうちの 1 つが 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");
}
于 2012-08-19T21:04:32.923 に答える
3

これはおそらくx.emailがnullであるためです。nullの場合、そのメンバーを呼び出すと例外がスローされます。

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

ただし、nullの可能性がある2つの値を比較することはできます

x.email == email      ==> OK.
于 2012-08-19T21:03:13.017 に答える
3

x.emailx のある値に対して null が原因であると思われます。

試す:

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

getAllMembers()編集: が a を返すことに気付いたList<T>ので、前に話した式ツリーの変換について心配する必要はありませんが、現在のコードは、このメソッドを呼び出すたびにデータベースからすべてのデータを取得しています。あなたは本当にそれをしたいですか?上記で提供したコードは、データベースでフィルタリングを行います。これは、きっとあなたが興味を持っていることです。

于 2012-08-19T21:07:38.990 に答える