Ho bisogno di sapere qual è la differenza tra JoinQueryOver e JoinAlias e quando utilizzarli?
Risposte:
Funzionalmente fanno la stessa cosa, creano un'unione a un'altra entità. L'unica differenza è ciò che restituiscono. JoinQueryOver restituisce un nuovo QueryOver con l'entità corrente che è l'entità unita, mentre JoinAlias restituisce il QueryOver originale che ha l'entità corrente come entità radice originale.
Qualunque sia quello che usi è una questione di gusto personale: (da 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");
e
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
Funzionalmente sono gli stessi. Nota come il kittenAlias viene espressamente indicato nella seconda query.
QueryOver Series - Part 2: Basics and Joining di Andrew Whitaker fornisce un'ottima spiegazione:
Sommario:
IQueryOver
è un tipo generico con due parametri di tipoTRoot
eTSubType
.Select
opera suTRoot
mentre altri metodi QueryOver operano suTSubType
.TRoot
rimane lo stesso che stai creando una query, maTSubType
cambia quando ti unisci usandoJoinQueryOver
JoinQueryOver
eJoinAlias
aggiungi join alla tua query.JoinAlias
non cambiaTSubType
, maJoinQueryOver
sì.- È possibile utilizzare alias durante la creazione di una query per fare riferimento a proprietà che non appartengono a
TRoot
oTSubType
Kitten kittenAlias = null;
eCat catAlias = null;
precedenti. Lo trovo disordinato, quindi non lo uso aJoinAlias
meno che non sia necessario.