web-dev-qa-db-fra.com

Quelle est la différence entre JoinQueryOver et JoinAlias?

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

merci.

84
Luka

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 ​​renvoie 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: (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 le kittenAlias ​​est expressément référencé dans la deuxième requête.

103
Vadim

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

Sommaire:

  • IQueryOver est un type générique avec deux paramètres de type TRoot et TSubType
  • .Select fonctionne sur TRoot tandis que d'autres méthodes QueryOver fonctionnent sur TSubType.
  • TRoot reste le même que lorsque vous créez une requête, mais TSubType change lorsque vous vous joignez à l'aide de JoinQueryOver
  • JoinQueryOver et JoinAlias ajoutent des jointures à votre requête. JoinAlias ne change pas TSubType, mais JoinQueryOver le fait.
  • 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 à TRoot ou TSubType
10
Michał Powaga