Мне нужно знать, в чем разница между JoinQueryOver и JoinAlias и когда их использовать?
Ответы:
Функционально они делают то же самое, создают соединение с другим объектом. Единственная разница в том, что они возвращают. 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.
QueryOver Series - Part 2: Basics and Joining Эндрю Уитакер дает очень хорошее объяснение:
Резюме:
IQueryOver
это универсальный тип с двумя параметрами типаTRoot
иTSubType
.Select
работает, вTRoot
то время как другие методы QueryOver работаютTSubType
.TRoot
остается таким же, как вы создаете запрос, ноTSubType
изменяется, когда вы присоединяетесь с помощьюJoinQueryOver
JoinQueryOver
иJoinAlias
добавьте соединения к вашему запросу.JoinAlias
не меняетсяTSubType
, ноJoinQueryOver
меняется.- Вы можете использовать псевдонимы при создании запроса для ссылки на свойства, которые не принадлежат
TRoot
илиTSubType
Kitten kittenAlias = null;
иCat catAlias = null;
ранее. Я считаю это беспорядочным, поэтому не используюJoinAlias
без необходимости.