NHibernate 3. Альтернативы "ThenFetch" в QueryOver
Я использую 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 нет такого метода, так как я могу достичь того же результата?
Спасибо заранее.
Ответы
Ответ 1
Мне действительно удалось решить эту проблему, используя два разных подхода:
Подходите к одному:
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)
Оба работают (хотя я не совсем уверен, что один из них генерирует "внутренний", а другой - "внешний" ).
Ответ 2
Как любопытство, я отправлю ответ, который они мне дали в 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)
Ответ 3
Я думаю, вы можете сделать это с помощью 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);