0

可能であれば、NHibernate - Detached Criteria で次の SQl を記述したいと思います。

select * from parent 
INNER JOIN child on parent.id=child.parentid 
INNER JOIN 
  (select ChildID, MAX(ChildDate) MaxChildDate from child group by ChildID) max
ON child.childid, child.ChildDate=max.MaxChildDate

これにより、すべてのパレットで最新の子が得られます。

Critera でサブクエリを記述できますが、ChildID と MaxDate の二重リンクを実行できません。

4

3 に答える 3

1

ありがとう、結合は例ほど単純ではなく、多くのテーブルが使用されていました.SQLセットベースのセットアップで行われた場合は問題ありませんが、linqでフィルタリングするために戻ってくるデータの量が非常に多かったでしょう.

残念ながら、設計よりも速度を優先する必要があったため、複雑な結合を含むビューを作成し、それをプライマリ ドメイン オブジェクトのディクショナリのテーブルとして使用しました。でも、助けてくれてありがとう。

乾杯

ストゥ

于 2010-02-14T11:14:32.957 に答える
0

親に並べ替えられたリスト プロパティ (ChildDate で並べ替え) を作成するので、最後に取得したときに (おそらく linq 拡張機能を使用して)、必要なものを取得します。複雑な結合を作成する必要はありません。

于 2009-12-22T21:44:11.300 に答える
0

あなたが求めていることを実際に行う方法を知っているとは言えません。NHibernate は、クエリしている実際のオブジェクトを返します。この場合、親オブジェクトのリスト/セットを返します。この親オブジェクトには、子オブジェクトのコレクションが関連付けられます。私の知る限り、このデータに 2 回リンクして異なる情報を引き出すという概念は、NHibernate では機能しません。

これを親で直接利用できるようにする必要がある場合は、Parent.hbm.xml ファイルの「where」属性を介してこれらの詳細を事前にフィルター処理した別の変数を親オブジェクトに作成することをお勧めします。これを行いたくない場合は、LINQ などを使用して、コレクション内の各親の最新の子オブジェクトを引き出すことをお勧めします。

Parent.hbm.xml ファイルにある "where" 属性の例は次のとおりです。

<set name="LatestChild" table="child" generic="true" inverse="true" where="*your sub-query here*">
  <key column="parent_id" />
  <one-to-many class="YourNameSpace.Model.Child,Model"/>
</set>

これは、コレクションの where クエリに一致する Child オブジェクトのみを返します。

これに関するドキュメントはこちらにあります。これは Hibernate のリファレンスであり、NHibernate ではありませんが、ほとんどの領域でほぼ同じです。

幸運を!

于 2009-12-17T01:53:01.350 に答える