определить подвыбор для запроса - PullRequest
2 голосов
/ 08 августа 2011

Я уверен, что мне здесь не хватает чего-то действительно очевидного.
То, что я хочу получить, довольно просто -

Я бы хотел, чтобы один запрос загружал все User без гидратации.их Posts и Followers коллекций.
В другом запросе я do хочу инициализировать эти коллекции, используя SubSelect .

использование Fetch(..) во втором запросе приведет к созданию левых соединений, что мне не нужно.
Я могу определить стратегии извлечения этих коллекций в сопоставлениях следующим образом (свободно):

.Not.LazyLoad()
.Fetch.Subselect()

, что заставило бы второй запрос работать так, как я хочу, но тогда я не могу отключить .Not.LazyLoad() для первого запроса (я пробовал .Fetch(u => u.Posts).Lazy, но это не похожеделать что-либо).

что мне не хватает?

1 Ответ

3 голосов
/ 08 августа 2011

Я обычно устанавливаю 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();

Вы можете найти больше информации здесь .

...