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:
IQueryOverjest typem ogólnym z dwoma parametrami typuTRootiTSubType.Selectdziała,TRootpodczas gdy inne metody QueryOver działają naTSubType.TRootpozostaje taka sama, jak podczas tworzenia zapytania, aleTSubTypezmienia się po dołączeniu za pomocąJoinQueryOverJoinQueryOveriJoinAliasdodaj sprzężenia do zapytania.JoinAliasnie zmienia sięTSubType, aleJoinQueryOverzmienia.- Możesz użyć aliasów podczas tworzenia zapytania, aby odwołać się do właściwości, które nie należą do
TRootlubTSubType
Kitten kittenAlias = null;iCat catAlias = null;wcześniejsze. Uważam, że jest brudny, więc nie używam,JoinAliaschyba że jest to konieczne.