Мне нужно знать, в чем разница между JoinQueryOver и JoinAlias, и когда использовать каждый?
спасибо.
Мне нужно знать, в чем разница между 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");
Функционально одинаковы. Обратите внимание на то, как котенка Alias явно ссылается во втором запросе.
Серия QueryOver - Часть 2: Основы и присоединение Эндрю Уитакера дает очень хорошее объяснение:
Резюме:
IQueryOver
- это общий тип с двумя параметрами типаTRoot
иTSubType
.Select
работает наTRoot
, тогда как другие методы QueryOver работают наTSubType
.TRoot
остается таким же, как вы создаете запрос, ноTSubType
изменяется при подключении с помощьюJoinQueryOver
JoinQueryOver
иJoinAlias
добавить к вашему запросу соединения.JoinAlias
не меняетTSubType
, ноJoinQueryOver
делает.- Вы можете использовать псевдонимы при построении запроса для ссылки на свойства, которые не принадлежат
TRoot
илиTSubType