これを行う方法に行き詰まりました:
私は国のエンティティを持っています。国には 0 個以上の事実があります。ファクトには Year というプロパティがあります。
Country エンティティをその名前でロードし、2011 などの特定の年からすべてのファクトを積極的に取得するにはどうすればよいですか (ただし、他のすべてのファクトはロードしません)。これは可能ですか?
これを行う方法に行き詰まりました:
私は国のエンティティを持っています。国には 0 個以上の事実があります。ファクトには Year というプロパティがあります。
Country エンティティをその名前でロードし、2011 などの特定の年からすべてのファクトを積極的に取得するにはどうすればよいですか (ただし、他のすべてのファクトはロードしません)。これは可能ですか?
これはフィルタリングを使用して可能だと思いますが、関心の分離に違反するため、お勧めできません。データの特別なビューを提示するためにドメイン モデルを使用しないでください。
おそらくより良い2つのオプション:
IEnumerable<Fact>
。測定可能なパフォーマンスの問題がない限り、このオプションを選択します。Future
と、データベースへのアクセスが 1 回だけで済みます。これは、nHibernate のフィルターを使用することで可能になると思います。この以前の StackOverflow の質問を読むことから始めます。
NHibernate - 子にのみ適用される基準で親/子を取得する
また、詳細については、nHibernate のドキュメントも参照してください。
更新: 私はこれを解決していません。以下の HQL は、事実が存在する場合にのみ機能します。特定の年の事実がない場合、結果は null になります。私のコンテキストを考えると、Fact を集約ルートとして扱い、Future() を使用して 2 つのクエリを発行するのが正しい解決策だと思います。
元の投稿
HQLを使用してこれを解決しました:
var country = Session.CreateQuery("from Country country left join fetch country.Facts as Facts where Facts.Year in (:years) and country.Name = :name ");
country.SetParameter("name", name);
country.SetParameterList("years", new List<int>() {2012, 2011});
他の提案をありがとう。問題に対する非HQLソリューションに興味がありますが、これはうまく解決します。
編集:
var query = session.QueryOver<Country>()
.Fetch(c => c.Facts)
.Eager()
.TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
.Future();
session.QueryOver<Facts>()
.Where(f => f.Year == 2011)
.Future();
var country = query.List().FirstOrDefault();