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 tipoTRooteTSubType.Selectopera suTRootmentre altri metodi QueryOver operano suTSubType.TRootrimane lo stesso che stai creando una query, maTSubTypecambia quando ti unisci usandoJoinQueryOverJoinQueryOvereJoinAliasaggiungi join alla tua query.JoinAliasnon cambiaTSubType, maJoinQueryOversì.- È possibile utilizzare alias durante la creazione di una query per fare riferimento a proprietà che non appartengono a
TRootoTSubType
Kitten kittenAlias = null;eCat catAlias = null;precedenti. Lo trovo disordinato, quindi non lo uso aJoinAliasmeno che non sia necessario.