LinqからNHibernateへ:シーケンスには要素がありません

私はここで何か間違っていることを知っている、私はちょうど私がその問題が何であるかをよく分からない。以下は、呼び出されるコードです:

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 を返します。

SingleSingleOrDefault
FirstFirstOrDefault
の違いを理解することは非常に重要です。

これらの方法の有用な視覚化は次のとおりです。

╔═════════════════╦═════════════╦═════════╦═════════════════════╗
║                 ║ [] (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.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です