Nhibernate QueryOver - почему я должен указать JoinQueryOver - PullRequest
4 голосов
/ 16 февраля 2011

В моих отображениях NHibernate у меня есть два объекта - Listing и User. Один пользователь может иметь много списков, и (Свободно) сопоставления настраиваются так:

Листинг:

References<User>(h => h.User).ForeignKey("fk_UserID").Not.LazyLoad().Fetch.Join().Cascade.SaveUpdate();

Пользователь:

 HasMany<Listing>(u => u.Listings);

Это отлично работает. Однако, когда я начал играть с QueryOver, я попытался:

DbSession.QueryOver<HaveListing>()
    .Where(h => h.IsModerated == false)
    .And(h => h.User.SpammedStatus == false)

Что не получается. Это, однако, работает:

DbSession.QueryOver<HaveListing>()
    .Where(h => h.IsModerated == false)
    .JoinQueryOver(h => h.User)
         .Where(u => u.SpammedStatus == false)

Очевидно, что с последним можно работать, но я хотел убедиться, что я что-то не упустил - мои отношения определены в сопоставлениях, поэтому мне действительно нужно каждый раз указывать соединение для выполнения WHERE на пользователя? Было бы бесполезно включать эти объединения каждый раз, когда в этом нет необходимости.

1 Ответ

5 голосов
/ 16 февраля 2011

QueryOver не является LINQ. Он использует выражения для указания имен свойств, но под капотом это критерии, поэтому он привязан к тем же правилам (все объединения явные)

Если у вас нет веских причин не делать этого, попробуйте следующее:

DbSession.Query<HaveListing>()
    .Where(h => h.IsModerated == false &&
                h.User.SpammedStatus == false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...