Muszę wiedzieć, jaka jest różnica między JoinQueryOver i JoinAlias i kiedy ich używać?
Odpowiedzi:
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.
Seria QueryOver - Część 2: Podstawy i łączenie autorstwa Andrew Whitakera daje bardzo dobre wyjaśnienie:
Podsumowanie:
IQueryOver
jest typem ogólnym z dwoma parametrami typuTRoot
iTSubType
.Select
działa,TRoot
podczas gdy inne metody QueryOver działają naTSubType
.TRoot
pozostaje taka sama, jak podczas tworzenia zapytania, aleTSubType
zmienia się po dołączeniu za pomocąJoinQueryOver
JoinQueryOver
iJoinAlias
dodaj sprzężenia do zapytania.JoinAlias
nie zmienia sięTSubType
, aleJoinQueryOver
zmienia.- Możesz użyć aliasów podczas tworzenia zapytania, aby odwołać się do właściwości, które nie należą do
TRoot
lubTSubType
Kitten kittenAlias = null;
iCat catAlias = null;
wcześniejsze. Uważam, że jest brudny, więc nie używam,JoinAlias
chyba że jest to konieczne.