Jaka jest różnica między JoinQueryOver i JoinAlias?

88

Muszę wiedzieć, jaka jest różnica między JoinQueryOver i JoinAlias ​​i kiedy ich używać?

Luka
źródło

Odpowiedzi:

108

Funkcjonalnie robią to samo, tworzą sprzężenie z innym bytem. Jedyną różnicą jest to, co zwracają. JoinQueryOver zwraca nową QueryOver z bieżącą jednostką będącą połączoną jednostką, podczas gdy JoinAlias ​​zwraca oryginalną QueryOver, która ma bieżącą jednostkę jako oryginalną jednostkę główną.

Którykolwiek z nich wybierzesz, jest kwestią osobistego gustu: (z 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");

i

Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => kittenAlias.Name == "Tiddles");

Funkcjonalnie są takie same. Zwróć uwagę, jak w drugim zapytaniu jest wyraźnie mowa o kittenAlias.

Vadim
źródło
7
Zauważ, że w drugim przykładzie musisz zadeklarować aliasy Kitten kittenAlias = null;i Cat catAlias = null;wcześniejsze. Uważam, że jest brudny, więc nie używam, JoinAliaschyba że jest to konieczne.
foka
Dziękuję @foka za wyjaśnienie tego. Brakowało mi tego i zastanawiałem się, dlaczego to nie działa.
Mario Tacke
12

Seria QueryOver - Część 2: Podstawy i łączenie autorstwa Andrew Whitakera daje bardzo dobre wyjaśnienie:

Podsumowanie:

  • IQueryOverjest typem ogólnym z dwoma parametrami typu TRootiTSubType
  • .Selectdziała, TRootpodczas gdy inne metody QueryOver działają na TSubType.
  • TRootpozostaje taka sama, jak podczas tworzenia zapytania, ale TSubTypezmienia się po dołączeniu za pomocąJoinQueryOver
  • JoinQueryOveri JoinAliasdodaj sprzężenia do zapytania. JoinAliasnie zmienia się TSubType, ale JoinQueryOverzmienia.
  • Możesz użyć aliasów podczas tworzenia zapytania, aby odwołać się do właściwości, które nie należą do TRootlubTSubType
Michał Powaga
źródło