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:
IQueryOver
ist ein generischer Typ mit zwei TypparameternTRoot
undTSubType
.Select
wird ausgeführt,TRoot
während andere QueryOver-Methoden ausgeführt werdenTSubType
.TRoot
bleibt beim Erstellen einer Abfrage unverändert,TSubType
ändert sich jedoch beim Beitritt mitJoinQueryOver
JoinQueryOver
undJoinAlias
fügen Sie Ihrer Abfrage Verknüpfungen hinzu.JoinAlias
ändert sich nichtTSubType
,JoinQueryOver
tut es aber .- Sie können beim Erstellen einer Abfrage Aliase verwenden, um auf Eigenschaften zu verweisen, die nicht zu
TRoot
oder gehörenTSubType
Kitten kittenAlias = null;
undCat catAlias = null;
früher deklarieren müssen . Ich finde es chaotisch, also benutze ich es nur,JoinAlias
wenn es notwendig ist.