В чем разница между JoinQueryOver и JoinAlias?

88

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

Лука
источник

Ответы:

108

Функционально они делают то же самое, создают соединение с другим объектом. Единственная разница в том, что они возвращают. 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");

Функционально такие же. Обратите внимание на то, что во втором запросе явно упоминается kittenAlias.

Вадим
источник
7
Обратите внимание, что во втором примере вы должны объявить псевдонимы Kitten kittenAlias = null;и Cat catAlias = null;ранее. Я считаю это беспорядочным, поэтому не использую JoinAliasбез необходимости.
foka 06
Спасибо @foka за разъяснение. Я пропустил это, и мне было интересно, почему это не сработало.
Марио Тэке
12

QueryOver Series - Part 2: Basics and Joining Эндрю Уитакер дает очень хорошее объяснение:

Резюме:

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