私はここで何か間違っていることを知っている、私はちょうど私がその問題が何であるかをよく分からない。以下は、呼び出されるコードです:
The call
System.Linq.Expressions.Expression> deleg =
(m => m.Email == model.Email);
AccountDataModel query = database.FindBy(deleg);
通話の発信場所
public T FindBy(Expression> expression)
{
return FilterBy(expression).Single();
}
public IQueryable FilterBy(Expression> expression)
{
return All().Where(expression).AsQueryable();
}
public IQueryable All()
{
return (from data in _session.Query()
select data);
}
スローされた例外
Sequence contains no elements
詳細情報
基本的には、現在テストしようとしているのは、存在するかどうかを確認するために提供されている電子メールを検索するウェブサイト上の登録モジュールです。暗号化された電子メールアドレスがデータベースに隠されています(モデルの電子メールも暗号化されています)。提供された登録メールと一致するはずです。問題は結果が返されないということです。
私はここで間違って何をしているのですか?
.Single
の呼び出しは、シーケンスが空の場合にこの例外をスローします。一致するものが見つからない可能性がある場合は、
.SingleOrDefault
を使用する必要があります。一致しない場合は
null
を返します。
Single
、 SingleOrDefault
、
First
、 FirstOrDefault
の違いを理解することは非常に重要です。
これらの方法の有用な視覚化は次のとおりです。
╔═════════════════╦═════════════╦═════════╦═════════════════════╗ ║ ║ [] (Empty) ║ ["one"] ║ ["one", "two",...] ║ ╠═════════════════╬═════════════╬═════════╬═════════════════════╣ ║ FirstOrDefault ║ null ║ "one" ║ "one" ║ ║ First ║ Exception ║ "one" ║ "one" ║ ║ SingleOrDefault ║ null ║ "one" ║ Exception ║ ║ Single ║ Exception ║ "one" ║ Exception ║ ╚═════════════════╩═════════════╩═════════╩═════════════════════╝ ╔═════════════════╦═════════════╦═════════╦═════════════════════╗ ║ Error messages: ║ no elements ║ ║ multiple elements ║ ╚═════════════════╩═════════════╩═════════╩═════════════════════╝
ご覧のとおり、 FirstOrDefault
だけが例外をスローしません。
So, what it comes down to is this:
The ONLY reason to use First
,
SingleOrDefault
, or Single
, is so that an
Exception will be thrown if your results are not as you expect!
This will give you a better debugging experience, and gives your
code better semantic meaning.