2012-03-14 2 views
3

私たちは、データベースからデータを取り出し、別のシステムにレポートを書き込むプロジェクトでNHibernateを使用しています。私のシナリオでは、患者は通常、いつもではないが、報告書が書かれたときに次の予定を予定している。以下のクエリは、レポートに含める次の予定データを取得します。NHibernate UniqueResultの代替?

予定が予定されている単一の結果があるとして通常、これは、正常に動作します:

private NextFollowup GetNextFollowup(int EncounterID) 
    { 
     try 
     { 
      NextFollowup myNextF = new NextFollowup(); 

      IQuery myNextQ = this.Session.GetNamedQuery("GetNextFollowup").SetInt32("EncounterID", EncounterID); 

      myNextF = myNextQ.UniqueResult<NextFollowup>(); 

      return myNextF; 

     } 
     catch (Exception e) 
     { 
      throw e; 
     } 

    } 

ここで質問ですね。ただし、次のフォローアップがない場合は、一意の結果がないというエラーが表示されます。この場合は例外をスローしたくないので空のオブジェクトを返したい。 UniqueResultの代わりにリストを取得する場合は、次のフォローアップがない状況で空のリストを取得します。 HQLクエリでリストを使用するよりも、「値がある場合は、1つしかありません」という状況を処理するより良い方法がありますか?

答えて

2

これは動作可能性があります

private NextFollowup GetNextFollowup(int encounterID) 
{ 
    IQuery query = this.Session.GetNamedQuery("GetNextFollowup").SetInt32("EncounterID", encounterID); 

    // nextFollowup will be either the next instance, or null if none exist in the db. 
    var nextFollowup = query.Enumerable<NextFollowup>().SingleOrDefault(); 

    return nextFollowup; 
} 

注:更新された命名は、Microsoftのベストプラクティスので、例外がある場合はトライキャッチは、スタックトレースを失うことを除き、ここに任意の目的を果たすされていない

に従うことをIそれを取り除いた。

新しいNextFollowupを返すようにしたい場合は何も存在しない場合は、あなたがクエリ行を更新することができます。

var nextFollowup = query.Enumerable<NextFollowup>().SingleOrDefault() ?? new NextFollowup();