Я обычно устанавливаю lazy=true
в своих отображениях (Ayende писал об этом ), потому что я предпочитаю контролировать поведение в моем коде.
При этом ваши ассоциации будут увлажнены, только если вы в них нуждаетесь.
var users = session.QueryOver<User>()
.List();
Будет загружать всех ваших пользователей, но не будет загружать их сообщения, если у вас нет доступа к элементу коллекции:
var postTitle = users[0].Posts[0].Title;
Если вы хотите загрузить некоторых пользователей и их сообщения, вы можете просто сделать что-то вроде этого:
Post posts = null;
var users = session.QueryOver<User>()
.Where(x => x.Name == "Jamie")
.Inner.JoinAlias(t => t.Posts, () => posts)
.List();
или
Post posts = null;
var users = session.QueryOver<User>()
.Where(x => x.Name == "Jamie")
.Inner.JoinQueryOver(t => t.Posts, () => posts)
.List();
Как вы могли заметить, используя Fetch Eager:
var users = session.QueryOver<User>()
.Where(x => x.Name == "Jamie")
.Fetch(x=>x.Posts).Eager
.List();
использует внешнее соединение, которое вам не нужно.
В предыдущих двух примерах будет проблема, о которой вы упоминали в своем комментарии.
Если вы хотите избежать декартовых произведений в своем результате с QueryOver, вы можете использовать .TransformUsing(Transformers.DistinctRootEntity)
:
Post posts = null;
var users = session.QueryOver<User>()
.Where(x => x.Name == "Jamie")
.Inner.JoinAlias(t => t.Posts, () => posts)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
Вы можете найти больше информации здесь .