NHibernate を使用して、いくつかの異なるテーブルからパラメーターをフィルター処理し、NHibernate の遅延読み込みを利用できるやや妥当な SQL を生成する検索クエリを作成しようとしています。オンラインでさまざまなヒントを読むと、次のスニペットのように、QueryOver オブジェクトを使用して、使用されているパラメーターを条件付きで追加することが、最新かつ最高の方法のようです。
Hibernate.Criterion.QueryOver<Models.Site, Models.Site> query = NHibernate.Criterion.QueryOver.Of<Models.Site>();
if (!string.IsNullOrEmpty(state))
query = query.WhereRestrictionOn(r => r.State.StateName).IsInsensitiveLike("%" + state + "%");
if (startDate.HasValue)
query = query.Where(r => r.Events
.Where(e=>e.EventDate >= startDate.Value)
.Count() > 0
);
return query.GetExecutableQueryOver(currentSession).Cacheable().List();
(イベントにはサイトへの外部キーがあります)
2 つの質問があります。親オブジェクトだけでなく、子オブジェクトをフィルター処理するにはどうすればよいですか? 上記のサンプル コードでは、一致するイベントを持つすべてのサイトが表示されますが、そのサイト内では、一致するイベントのみが必要です。結合またはサブクエリを使用することになっている場合、どのように使用しますか? 結合またはサブクエリによる遅延読み込みでツリーのような階層を維持することについて混乱しています。
編集:これは回答済みです。ありがとうございます!
or 句を追加するにはどうすればよいですか? Disjunction オブジェクトへの参照を見つけましたが、QueryOver メソッドを使用して利用できるようには見えません。
編集: サイト基準でフィルタリングされたサイト (最上位オブジェクト) のリストを作成したいのですが、各サイトには、イベント基準でフィルタリングされたイベントのリストが必要です。
次のような SQL が生成されることを期待しています。
SELECT *
FROM [site] s
LEFT JOIN [event] e ON s.siteID = e.siteID
WHERE e.eventDate > @eventDate
AND (s.stateCd = @state OR s.stateName LIKE @state)