Was ist der Unterschied zwischen JoinQueryOver und JoinAlias?

88

Ich muss wissen, was der Unterschied zwischen JoinQueryOver und JoinAlias ​​ist und wann ich sie verwenden soll.

Luka
quelle

Antworten:

108

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.

Vadim
quelle
7
Beachten Sie, dass Sie im zweiten Beispiel die Aliase Kitten kittenAlias = null;und Cat catAlias = null;früher deklarieren müssen . Ich finde es chaotisch, also benutze ich es nur, JoinAliaswenn es notwendig ist.
Foka
Vielen Dank an @foka für die Klarstellung. Ich habe das verpasst und mich gefragt, warum es nicht funktioniert hat.
Mario Tacke
12

QueryOver Series - Teil 2: Grundlagen und Beitritt von Andrew Whitaker gibt eine sehr gute Erklärung:

Zusammenfassung:

  • IQueryOverist ein generischer Typ mit zwei Typparametern TRootundTSubType
  • .Selectwird ausgeführt, TRootwährend andere QueryOver-Methoden ausgeführt werden TSubType.
  • TRootbleibt beim Erstellen einer Abfrage unverändert, TSubTypeändert sich jedoch beim Beitritt mitJoinQueryOver
  • JoinQueryOverund JoinAliasfügen Sie Ihrer Abfrage Verknüpfungen hinzu. JoinAliasändert sich nicht TSubType, JoinQueryOvertut es aber .
  • Sie können beim Erstellen einer Abfrage Aliase verwenden, um auf Eigenschaften zu verweisen, die nicht zu TRootoder gehörenTSubType
Michał Powaga
quelle