2

私のクラスは次のようになります (関連するプロパティのみを含めます)。

public class Order 
{
   public virtual Customer Customer { get; set; }
   public virtual IEnumerable<OrderLine> OrderLines { get; set; }
}

public class OrderLine 
{
   public virtual string Product { get; set; } // Simplified
}

今私が欲しいのは、特定の顧客のすべての注文を選択すると同時に、各注文の最初の 10 個の OrderLines のみを取得する分離基準を作成することです。最初の部分は簡単です:

Customer someCustomerObject = ...;
var criteria = DetachedCriteria.For<Order>().Add(Restrictions.Eq("Customer", someCustomerObject);

しかし、上記の基準によって取得された各注文の最初の 10 個のオーダーラインを熱心に取得するように NHibernate に指示するにはどうすればよいでしょうか?

次の例に基づいてフィルターを使用してみました (Nhibernate のドキュメントから取得)。

session.CreateFilter( lazyCollection, "").SetFirstResult(0).SetMaxResults(10).List();

しかしOrder.OrderLines、メソッドに与えると、CreateFilter最初にすべてのオーダーラインが取得され、その後、最初の 10 個のオーダーラインが取得されますが、これは私が望むものではありません。NHibernateUtil.Initializeまた、これを役に立たないという呼び出しと組み合わせてみました。

この問題に対して独立した基準を作成するにはどうすればよいですか? または、それが完全に不可能な場合は、コレクション全体を取得せずに、注文ごとに最初の 10 件の結果のみを取得する方法を教えてください。

4

1 に答える 1

0

batch-sizeOrder クラスの NHibernate マッピング ファイルで、プロパティを 10 に設定できます。このようにして、コレクションの最初の 10 個の要素を積極的に読み込み、残りの要素を遅延読み込みします。コレクションを次のようにマップします。

<set name="OrderLines" table="OrderToOrderLine" batch-size="10">
    <key column="OrderId"/>
    <one-to-many class="OrderLine"/>
</set>

詳細については、次を参照してください: NHibernate マッピング - コレクション

于 2010-12-20T05:32:41.170 に答える