В чем разница между JoinQueryOver и JoinAlias? - PullRequest
84 голосов
/ 24 марта 2011

Мне нужно знать, в чем разница между JoinQueryOver и JoinAlias ​​и когда их использовать?

спасибо.

Ответы [ 2 ]

103 голосов
/ 24 марта 2011

Функционально они делают то же самое, создают соединение с другим объектом.Единственная разница в том, что они возвращают.JoinQueryOver возвращает новый QueryOver, в котором текущая сущность является присоединенной сущностью, а JoinAlias ​​возвращает исходный QueryOver, в котором текущая сущность является исходной корневой сущностью.

Какой бы из них вы ни использовали, это вопрос личного вкуса: (от http://nhibernate.info/doc/nh/en/index.html#queryqueryover)

IQueryOver<Cat,Kitten> catQuery =
    session.QueryOver<Cat>()
        .JoinQueryOver<Kitten>(c => c.Kittens)
            .Where(k => k.Name == "Tiddles");

и

Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => kittenAlias.Name == "Tiddles");

Функционально одинаковы. Обратите внимание, как котенок Алиаспрямо указывается во втором запросе.

10 голосов
/ 03 сентября 2014

Серия QueryOver - Часть 2. Основы и объединение Эндрю Уитакера дает очень хорошее объяснение:

Резюме:

  • IQueryOverявляется универсальным типом с двумя параметрами типа TRoot и TSubType
  • .Select работает на TRoot, в то время как другие методы QueryOver работают на TSubType.
  • TRoot остаетсяТо же самое, что и при создании запроса, но TSubType изменяется, когда вы присоединяетесь с помощью JoinQueryOver
  • JoinQueryOver и JoinAlias добавления объединений к вашему запросу.JoinAlias не меняет TSubType, но JoinQueryOver меняет.
  • Вы можете использовать псевдонимы при построении запроса для ссылки на свойства, которые не принадлежат TRoot или TSubType
...