J'ai besoin de savoir quelle est la différence entre JoinQueryOver et JoinAlias, et quand les utiliser?
Réponses:
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.
QueryOver Series - Part 2: Basics and Joining par Andrew Whitaker donne une très bonne explication:
Résumé:
IQueryOver
est un type générique avec deux paramètres de typeTRoot
etTSubType
.Select
fonctionneTRoot
alors que d'autres méthodes QueryOver fonctionnentTSubType
.TRoot
reste le même que vous créez une requête, maisTSubType
change lorsque vous rejoignez en utilisantJoinQueryOver
JoinQueryOver
etJoinAlias
ajoutez des jointures à votre requête.JoinAlias
ne change pasTSubType
, mais leJoinQueryOver
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
ouTSubType
Kitten kittenAlias = null;
et les versionsCat catAlias = null;
antérieures. Je trouve ça désordonné, donc je ne l'utiliseJoinAlias
que si c'est nécessaire.