Nhibernate QueryOver Left Outer Соединяется с условиями - PullRequest
4 голосов
/ 30 мая 2011

Я нашел несколько ресурсов в сети, но на самом деле не смог разобраться с этим

В основном у меня есть запрос, в котором есть два оставшихся внешних соединения

var query = session.QueryOver<NewsPost>(() => newsPostAlias)
                    .Left.JoinQueryOver(x => newsPostAlias.PostedBy, () => userAlias)
                    .Left.JoinQueryOver(x => newsPostAlias.Category, () => categoryAlias)
                        .Fetch(x => x.PostedBy).Eager
                        .Fetch(x => x.Category).Eager
                    .Where(x => !x.Deleted);

Это может быть неправильный способ сделать это, но, похоже, он не сломается. Теперь я хочу, чтобы на двух таблицах, которые оставили внешние соединения, я хочу убедиться, что столбец Удалено в обеих этих таблицах равен false.

Однако всякий раз, когда я добавляю это ограничение, результаты возвращаются только тогда, когда столбец внешнего ключа в новостной ленте заполнен, но так как это можно обнулять, и почему я сделал это левосторонним присоединением, это нежелательно.

Каков лучший способ сделать это

.Where(x => !x.Deleted && !x.PostedBy.Deleted && !x.Category.Deleted);

Я изучал мультизапросы, фьючерсы и дизъюнкции, я не уверен, какой подход следует использовать, очевидно, я могу придумать несколько способов (плохих способов, которые подсказывает мне мой инстинкт), но что является правильным? :)

Спасибо

РЕДАКТИРОВАТЬ - Модификация принятого ответа

return session.QueryOver(() => newsPostAlias)
                    .Fetch(x => x.PostedBy).Eager
                    .Fetch(x => x.Category).Eager
                .Left.JoinQueryOver(() => newsPostAlias.PostedBy, () => postedByAlias)
                .Left.JoinQueryOver(() => newsPostAlias.Category, () => categoryAlias)
                .Where(() => !newsPostAlias.Deleted)
                .And(() => newsPostAlias.PostedBy == null ||  !postedByAlias.Deleted)
                .And(() => newsPostAlias.Category == null ||  !categoryAlias.Deleted)
                .OrderBy(() => newsPostAlias.PostedDate).Desc
                .Take(10)
                .List();

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

Полагаю, ваш запрос должен выглядеть следующим образом

        Session.QueryOver<NewsPost>()
            .Left.JoinAlias(x => x.PostedBy, () => userAlias)
            .Left.JoinAlias(x => x.Category, () => categoryAlias)
            .Where(x => !x.Deleted)
            .And(x => !userAlias.Deleted)
            .And(x => !categoryAlias.Deleted);
0 голосов
/ 30 мая 2011

Это похоже на работу ...

var posts = session.QueryOver<NewsPost>()
    .Left.JoinAlias(x => x.Category, () => category)
    .Left.JoinAlias(x => x.PostedBy, () => user)
    .Where(x => x.Deleted == false)
    .Where(Restrictions
        .Or(
                Restrictions.Where(() => user.Deleted == false), 
                Restrictions.Where<NewsPost>(x => x.PostedBy == null)
        )
    )
    .Where(Restrictions
        .Or(
                Restrictions.Where(() => category.Deleted == false), 
                Restrictions.Where<NewsPost>(x => x.Category == null)
        )
    )
    .List();

Был ли это один из способов, по которым вы чувствовали себя плохо? Если да, не могли бы вы объяснить, почему? Я не знаю достаточно об оптимизации SQL, поэтому прошу ...

...