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.

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.