0

オブジェクトの読み取り専用プロパティ ( LastCompletedDate)を計算する、MS SQL で定義された DB 集中型関数がありInspectionます。通常、この情報は必要ないため、 ではマッピングしていませんInspection.hbm.xml

情報が必要な場合は、 の IEnumerable コレクションを取得しInspections、データベースにクエリを実行して を検索しLastCompletedDate、それぞれに入力します。理想的には、それぞれのデータベースに個別に移動する必要はありませんInspection。私はNHibernateでこれを行う方法を見つけるのに苦労しています(私はNHibernateの比較的初心者です)。私は次のようなことを考えています:

CurrentSession.CreateQuery(
                "select InspectionId, dbo.fn_GetLastCompletedDate(InspectionId) 
                 from Inspection where InspectionId in :idList")
              .SetParameter("idList", from InspectionList   select InspectionId)
              .List();

その後、日付を取り出して検査オブジェクトに追加するループが続きます。

これを行うより良い方法はありますか?そして、どのような構文が必要ですか?

4

1 に答える 1

1

私が考えることができる2つの可能なオプションがあります。

  1. プロパティを遅延読み込みとしてマークする

    <property name="LastCompletedDate" 
              lazy="true" 
              formula="dbo.fn_GetLastCompletedDate(InspectionId)"/>
    

    クエリを実行してすべての検査オブジェクトを取得する場合、このプロパティは読み込まれません。

    CurrentSession.CreateQuery("from Inspection")
                  .List<Inspection>();
    

    ただし、ヒントを含めると、このプロパティは他のすべてのプロパティと共に読み込まれます。

    CurrentSession.CreateQuery("from Inspection fetch all properties")
                  .List<Inspection>();
    

    このアプローチの欠点は、このヒントが HQL を使用している場合にのみ利用できることです。詳細はこちら

    http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties

  2. 2 番目のオプションは、遅延読み込みが有効になっているコンポーネントを使用することです。

    <component name="lazy_load_items" lazy="true">        
         <property name="LastCompletedDate" 
                   formula="dbo.fn_GetLastCompletedDate(InspectionId)"/>
    </component>
    

    繰り返しますが、これは遅延読み込みであるため、Inspection エンティティに対する通常のクエリでは、各行に対して関数が呼び出されません。

    CurrentSession.QueryOver<Inspection>.List();
    

    ただし、任意のクエリ API を介して熱心にロードできます。

    session.QueryOver<Inspection>()
           .Fetch(i => i.lazy_load_items).Eager
           .List();
    

    このアプローチのこの欠点は、単一のプロパティを含めるためだけに追加のクラスを作成する必要があることです。

    アップデート

    fetch all propertiesさらにテストすると、コンポーネントの熱心な読み込みは、ヒントを使用した HQL でのみ機能するようです。したがって、私が示したクエリの例は間違っているため、コンポーネント アプローチの利点も間違っています。

于 2013-04-30T20:33:55.943 に答える