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


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

спасибо.

2 84

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