Подтвердить что ты не робот

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

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

спасибо.

4b9b3361

Ответ 1

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

Ответ 2

Серия QueryOver - Часть 2: Основы и присоединение Эндрю Уитакера дает очень хорошее объяснение:

Резюме:

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