NHibernate 3. Альтернативы "ThenFetch" в QueryOver - PullRequest
13 голосов
/ 26 января 2011

Я использую NHibernate 3.0 как с поставщиком LINQ, так и с QueryOver. Иногда я хочу загружать связанные данные, и на помощь приходит метод Fetch, как в LINQ, так и в QueryOver. Теперь у меня есть особый сценарий, в котором я хочу загрузить свойство не непосредственно на втором уровне, например:

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 такого метода нет, так как я могу достичь того же результата?

Заранее спасибо.

Ответы [ 3 ]

16 голосов
/ 26 января 2011

Мне действительно удалось решить эту проблему, используя два разных подхода:

Первый подход:

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

Второй подход:

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)

Оба работают (хотя яЯ не совсем уверен, что один из них генерировал "внутренний", а другой - "внешний".)

16 голосов
/ 20 декабря 2011

Просто из любопытства я опубликую ответ, который мне дали на NHibernate Jira :

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) 
4 голосов
/ 26 января 2011

Я думаю, что вы можете сделать это с 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); 
...