0

これを行う方法に行き詰まりました:

私は国のエンティティを持っています。国には 0 個以上の事実があります。ファクトには Year というプロパティがあります。

Country エンティティをその名前でロードし、2011 などの特定の年からすべてのファクトを積極的に取得するにはどうすればよいですか (ただし、他のすべてのファクトはロードしません)。これは可能ですか?

4

4 に答える 4

2

これはフィルタリングを使用して可能だと思いますが、関心の分離に違反するため、お勧めできません。データの特別なビューを提示するためにドメイン モデルを使用しないでください。

おそらくより良い2つのオプション:

  1. 上の拡張メソッドを使用して、すべての事実を取得し、年ごとにフィルター処理しますIEnumerable<Fact>。測定可能なパフォーマンスの問題がない限り、このオプションを選択します。
  2. 結果セットをカプセル化するビュー クラスを作成します。を使用して 1 年間の国と事実を取得する 2 つのクエリを作成するFutureと、データベースへのアクセスが 1 回だけで済みます。
于 2012-11-21T15:32:20.020 に答える
1

これは、nHibernate のフィルターを使用することで可能になると思います。この以前の StackOverflow の質問を読むことから始めます。

NHibernate - 子にのみ適用される基準で親/子を取得する

また、詳細については、nHibernate のドキュメントも参照してください。

http://nhibernate.info/doc/nh/en/index.html#filters

于 2012-11-21T13:37:19.160 に答える
0

更新: 私はこれを解決していません。以下の 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ソリューションに興味がありますが、これはうまく解決します。

于 2012-11-21T15:30:08.043 に答える
0

編集:

 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();
于 2012-11-21T13:58:24.873 に答える