13

LINQ プロバイダーと QueryOver の両方で NHibernate 3.0 を使用しています。関連するデータを熱心にロードしたい場合があり、LINQ と QueryOver の両方で "Fetch" メソッドが役に立ちます。今、次のように、第 2 レベルではないプロパティを直接ロードしたいという特別なシナリオがあります。

Foo f = ...;
f.A.B.C

LINQ では、次のようにメソッド「ThenFetch」を使用してフェッチを「チェーン」できるため、問題はありません。

var result = Session.Query<Foo>().Fetch(a => a.A).ThenFetch(b => b.B).ThenFetch(c => c.C).ToList();

QueryOver にはそのようなメソッドはありません。どうすれば同じ結果を得ることができますか?

前もって感謝します。

4

3 に答える 3

16

私は実際に2つの異なるアプローチを使用してこの問題を解決することができました:

アプローチ1:

Session.QueryOver<Foo>().Fetch(x => x.A).Fetch(x => x.A.B).Fetch(x => x.A.B.C)

アプローチ2:

A a = null;
B b = null;
C c = null;

Session.QueryOver<Foo>()
    .JoinAlias(x => x.A, () => a)
    .JoinAlias(() => a.B, () => b)
    .JoinAlias(() => b.C, () => c)

両方とも機能します(ただし、一方が「内部」を生成し、もう一方が「外部」結合を生成したかどうかは正確にはわかりません)。

于 2011-01-26T12:42:06.830 に答える
16

好奇心と同じように、NHibernateJiraに彼らからの返信を投稿します。

query 
    .Fetch(p => p.B) 
    .Fetch(p => p.B.C) // if B is not a collection ... or 
    .Fetch(p => p.B[0].C) // if B is a collection ... or 
    .Fetch(p => p.B.First().C) // if B is an IEnumerable (using .First() extension method) 
于 2011-12-20T16:17:17.163 に答える
4

JoinQueryOver でそれができると思います

IQueryOver<Relation> actual =
   CreateTestQueryOver<Relation>()
    .Inner.JoinQueryOver(r => r.Related1)
    .Left.JoinQueryOver(r => r.Related2)
    .Right.JoinQueryOver(r => r.Related3)
    .Full.JoinQueryOver(r => r.Related4)
    .JoinQueryOver(r => r.Collection1, () => collection1Alias)
    .Left.JoinQueryOver(r => r.Collection2, () => collection2Alias)
    .Right.JoinQueryOver(r => r.Collection3)
    .Full.JoinQueryOver(r => r.People, () => personAlias); 
于 2011-01-26T11:08:25.657 に答える