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