2

私はこのクエリを持っています:

IQueryable<OrderEntity> _records = All().Fetch(x => x.client).FetchMany(x => x.orderItems).ThenFetch(y => y.righeDistinte); 

この質問の問題を簡単に説明すると、これらは関係するエンティティです。

public class OrderEntity : IEntity
{
    public virtual ClientEntity client { get; set; }
    public virtual ICollection<OrderItemEntity> orderItems { get; set; }
}

public class ClientEntity
{
    public virtual String cod_clifor { get; set; }
    public virtual String des_ragsoc { get; set; }
}

public class OrderItemEntity
{
    public virtual ICollection<DistintaItemEntity> righeDistinte { get; set; }
}

public class DistintaItemEntity
{
    public virtual OrderItemEntity orderItem { get; set; }
    public virtual DistintaEntity distinta { get; set; }
}

したがって、各OrderEntityインスタンスは、1つのClientEntityと0から多くのOrderItemEntityオブジェクトを参照します。次に、各OrderItemEntityは0から多くのDistintaItemEntityを参照できます。

この投稿の上部にあるクエリは、関連するクライアントとorderitemsを含むすべての注文のコレクションを返し、各orderitemには識別性がフェッチされます(すべてのマッピングが適切に設定されています)。たった1つのSQLクエリですべて。

ここまでは順調ですね。

問題は、強制的に読み込まれないDistintaEntityにあります。そのため、そのプロパティの一部にアクセスする場合は、遅延読み込みのためにセッションを開く必要があります(開いているセッションがある限り、機能しますが、追加のクエリがありますもちろん)。

各DistintaItemEntityに関連付けられたDistintaEntityオブジェクトの直接フェッチを強制するディレクティブをクエリに追加したいのですが、単一のクエリ結果を失うことなくそれを行う方法がわかりません。

すべての1対多の関係は結合されたままになります。

ありがとう、マリオ

4

2 に答える 2

1

フォローアップ:以前の回答で述べたクエリは機能しますが、上記のコメントの手形で述べたように、nHibernateがデカルト積を不適切にスキャンするため、複数の子に簡単につながる可能性があります。

リンク先の記事に記載されている解決策の1つを試しました。マッピングを変更してAsSet()ディレクティブをHasMany()に追加すると、この問題も修正されたようです。

ここでのフルスタックオーバーフローの質問:NHibernateThenFetchManyは重複する子を取得しています。

于 2012-08-27T15:39:11.070 に答える
0

最初のコメントに続いて、私は答えを見つけることができました: 最後の ThenFetch を ThenFetchMany に置き換えることで、さらにチェーンされた Fetch を指定することができました。

最後のクエリは次のとおりです。

IQueryable<OrderEntity> _records = All().Fetch(x => x.client).FetchMany(x => x.orderItems).ThenFetchMany(y => y.righeDistinte).ThenFetch(p => p.Distinta);

助けてくれてありがとう。

于 2012-08-23T09:24:17.557 に答える