Quelle est la différence entre JoinQueryOver et JoinAlias?


88

J'ai besoin de savoir quelle est la différence entre JoinQueryOver et JoinAlias, et quand les utiliser?

Réponses:


108

Fonctionnellement, ils font la même chose, créent une jointure avec une autre entité. La seule différence est ce qu'ils retournent. JoinQueryOver renvoie un nouveau QueryOver avec l'entité actuelle étant l'entité jointe, tandis que JoinAlias ​​retourne le QueryOver d'origine qui a l'entité actuelle comme entité racine d'origine.

Celui que vous utilisez est une question de goût personnel: (à partir de 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");

et

Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => kittenAlias.Name == "Tiddles");

Sont fonctionnellement les mêmes. Notez comment kittenAlias ​​est expressément référencé dans la deuxième requête.


7
Notez que dans le deuxième exemple, vous devez déclarer les alias Kitten kittenAlias = null;et les versions Cat catAlias = null;antérieures. Je trouve ça désordonné, donc je ne l'utilise JoinAliasque si c'est nécessaire.
foka le

Merci @foka pour cette clarification. J'ai manqué cela et je me demandais pourquoi cela ne fonctionnait pas.
Mario Tacke

12

QueryOver Series - Part 2: Basics and Joining par Andrew Whitaker donne une très bonne explication:

Résumé:

  • IQueryOverest un type générique avec deux paramètres de type TRootetTSubType
  • .Selectfonctionne TRootalors que d'autres méthodes QueryOver fonctionnent TSubType.
  • TRootreste le même que vous créez une requête, mais TSubTypechange lorsque vous rejoignez en utilisantJoinQueryOver
  • JoinQueryOveret JoinAliasajoutez des jointures à votre requête. JoinAliasne change pas TSubType, mais le JoinQueryOverfait.
  • Vous pouvez utiliser des alias lors de la création d'une requête pour faire référence à des propriétés qui n'appartiennent pas à TRootouTSubType
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.