2011-11-13 17 views
2

私はここで何か間違っていることを知っています。何が問題なのかよく分かりません。呼び出しがにLinq to NHibernate:シーケンスには要素が含まれていません

public T FindBy(Expression<Func<T, bool>> expression) 
     { 
      return FilterBy(expression).Single(); 
     } 

public IQueryable<T> FilterBy(Expression<Func<T, bool>> expression) 
     { 
      return All().Where(expression).AsQueryable(); 
     } 

public IQueryable<T> All() 
     { 
      return (from data in _session.Query<T>() 
        select data); 
     } 

をリード

コール

System.Linq.Expressions.Expression<Func<AccountDataModel, bool>> deleg = 
          (m => m.Email == model.Email); 
         AccountDataModel query = database.FindBy(deleg); 

Sequence contains no elements 
をスローされた例外:ここに呼ばれているコードです3210

澤は基本的に

の詳細を、私は今、テストしようとしていることは、それが存在するかどうかを確認するために提供されている電子メールの検索になっている私のウェブサイト上の登録モジュールです。暗号化された電子メールアドレスがデータベースに隠されています(モデルの電子メールも暗号化されています)。提供された登録メールと一致するはずです。問題は結果が返されないということです。

私は正確にここで間違っていますか?

答えて

7

.Singleを呼び出すと、シーケンスが空の場合にこの例外がスローされます。一致するものが見つからない可能性がある場合は、一致するものがなければnullを返す.SingleOrDefaultを使用する必要があります。

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は例外をスローしないであろう唯一のものです。

だから、それはこのであるために下に来るもの:あなたが期待するよう、あなたの結果がない場合は、例外がスローされるようにFirstSingleOrDefault、またはSingleを使用する唯一の理由
、です!
これにより、デバッグの利便性が向上し、コードのセマンティックな意味が向上します。

+0

ありがとうございます - 私はあなたが提案したものにコードを変更しましたが、私はまだ同じエラーを受けています。私のクエリが不適切に実装されている可能性はありますか? –

+1

'Single'または' First'を使用しているときだけ "シーケンスに要素がありません"というエラーがスローされます。* OrDefaultによってスローされません。 –

+0

@HollandSchutte私はさまざまな方法のより良い説明で私の答えを更新しました。うまくいけば、それはあなたの問題の原因を見つけるのに役立ちます。 –

関連する問題