2011-01-03 15 views
3

私はにtableATABLEBなぜnhibernate LINQは簡単な外部結合をサポートしていません(外部結合テーブルにwhere句が指定されています)。

にtableAがB_ID性質を持っています。

IEnumerable<A> a = Session.Query<A>().Fetch(r=>r.B); 

しかし、私のような何かをしたい:

このクエリは正常に動作します

IEnumerable<A> a = Session.Query<A>().Where(r=>r.B.Active).Fetch(r=>r.B); 

それは私がこれを行う際に何がある場合、それはもはや、単純な外部結合をしないとないように思えますテーブルBのアクティブなレコード、私は結果が得られません。

私はまだ結果を返しますが、AエンティティのBプロパティをnullにする純粋な外部結合を実行したいと思います。

nhibernate LINQは、外部結合テーブルにwhere句を設定するこの機能をサポートしていますか?

+0

実行されたSQL文と実行したいSQL文を表示できますか? – sisve

+0

@Simon Svensson - 非常にシンプルで、上のコードは結合の外側にはないので、B.Activeレコードがない場合は行を返しません。 – leora

答えて

3

this post on the nhusers groupによると、明らかにサポートされていないため、HQLを使用する必要があります。

理由については、私は著者が追加しようと考えていますが、より高い優先順位を持っていたと推測します。個人的に私はそれを重要な機能と見ています。

+0

HQLと同等のもの – leora

+0

@ooo - http://www.nhforge.org/doc/nh/en/index.html#queryhql-joinsを参照してください。 – TrueWill

0

推測:.Where(a => a.B == null || a.B.Active)

思考:あなたは未知の状態になりますのインスタンスを選択しようとしています。 NHibernateは、AのインスタンスB == nullとB.Active == falseの間でどのように違いますか?

両方とも動作した場合、Bのnull値を返し、Aにはnull参照が設定されます。 Aをもう一度保存するとどうなりますか? Bへの参照をnullに設定する必要がありますか?これは、B.Active == falseのときに参照を削除します。それは手つかずであるべきですか?これは、あなたのドメインオブジェクトを表さない状態をNHibernateに保存させます。

+0

@Simon Svensson - それは外部結合の基本ではありません。他のテーブルに有効なレコードがあるかどうかにかかわらず、1つのテーブルのすべてのレコードを表示する – leora

+0

はい、Bへの参照がnullであるかどうかを知る必要のあるドメインモデルにはどのように適用されますか?フィルタに一致するBはありませんか?基本的なクエリはNHibernateに何も知らせていません。 – sisve

+0

@Simon Svensson - この場合、outerjoinを書くにはwhere句を使います。シンプルではその参照にnullが返されます(レコードを返さない場合と比較して) – leora

関連する問題