1

オブジェクトの子コレクションがたくさんある複雑なエンティティがありますが、これも複雑です。

public class Order : AdvancedBaseOrder, ICheckable
{
    public virtual ICollection<RouteUnit> RouteUnits
    public virtual ICollection<Invoice> Invoices
    public virtual ICollection<Call> Calls;
    public virtual ICollection<Payment> Payments;
    ......
}

私の支払いクラスは他の多くのオブジェクトを集約します

public class Payment:  ICheckable
{
    public virtual A A;
    public virtual B B;
    public virtual C C;
    public virtual D D;
    ......
}

2つのクエリで注文を取得したい:

  1. 支払いなしで注文エンティティをロードする(FetchMode.Lazy)
  2. オブジェクトを結合して注文ごとに支払いをロードする
  3. 注文とその支払いを組み合わせる\

nhibによる遅延読み込みの支払いは必要ありません。支払いのオブジェクトのフェッチ戦略をオーバーライドしたいからです。

だから私の質問は、クエリの2つの結果を1つの集計に結合する方法です。ありがとう

4

1 に答える 1

1

この場合、batch-size="25"設定はあなたのために仕事をすることができます。詳細については、ドキュメントを参照してください: 19.1.5. バッチ フェッチの使用

バッチ サイズは、クラスまたはコレクションのマッピングに適用できます。

支払いクラス

<class name="Payment" batch-size="10">...</class>

代金の回収

<class name="Order">
    <set name="Payments" batch-size="3">
        ...
    </set>
</class>

バッチ処理の仕組みを簡単に説明すると、NHibernates はすべての のセットをロードしますOrders。次に、バッチサイズの設定 (例: 25) に基づいて、読み込まれたばかりのOrdersPaymentsによってフィルタリングされた呼び出しをいくつか作成します。ID

WHERE OrderId in (@o1、@o2、@O3... @o25)

マージは NHibernate セッション内で行われます。私の経験からすると、これは最も強力なマッピングです... Lazy & Batching。

于 2013-02-10T18:44:37.640 に答える