Antworten:
Funktionell machen sie dasselbe, erstellen einen Join zu einer anderen Entität. Der einzige Unterschied ist, was sie zurückgeben. JoinQueryOver gibt einen neuen QueryOver zurück, wobei die aktuelle Entität die verknüpfte Entität ist, während JoinAlias den ursprünglichen QueryOver zurückgibt, der die aktuelle Entität als ursprüngliche Stammentität hat.
Welches Sie verwenden, ist eine Frage des persönlichen Geschmacks: (von 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");
und
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
Sind funktional gleich. Beachten Sie, wie in der zweiten Abfrage ausdrücklich auf kittenAlias verwiesen wird.
QueryOver Series - Teil 2: Grundlagen und Beitritt von Andrew Whitaker gibt eine sehr gute Erklärung:
Zusammenfassung:
IQueryOverist ein generischer Typ mit zwei TypparameternTRootundTSubType.Selectwird ausgeführt,TRootwährend andere QueryOver-Methoden ausgeführt werdenTSubType.TRootbleibt beim Erstellen einer Abfrage unverändert,TSubTypeändert sich jedoch beim Beitritt mitJoinQueryOverJoinQueryOverundJoinAliasfügen Sie Ihrer Abfrage Verknüpfungen hinzu.JoinAliasändert sich nichtTSubType,JoinQueryOvertut es aber .- Sie können beim Erstellen einer Abfrage Aliase verwenden, um auf Eigenschaften zu verweisen, die nicht zu
TRootoder gehörenTSubType
Kitten kittenAlias = null;undCat catAlias = null;früher deklarieren müssen . Ich finde es chaotisch, also benutze ich es nur,JoinAliaswenn es notwendig ist.