Funcionalmente hacen lo mismo, crean una unión a otra entidad. La única diferencia es lo que devuelven. JoinQueryOver devuelve un nuevo QueryOver con la entidad actual siendo la entidad unida, mientras que JoinAlias devuelve el QueryOver original que tiene la entidad actual como la entidad raíz original.
Cualquiera que use es una cuestión de gusto personal: (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");
y
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
Son funcionalmente iguales. Observe cómo se hace referencia expresa a kittenAlias en la segunda consulta.
Kitten kittenAlias = null;
yCat catAlias = null;
antes. Lo encuentro complicado, así que no lo uso aJoinAlias
menos que sea necesario.QueryOver Series - Part 2: Basics and Unirse por Andrew Whitaker da una muy buena explicación:
fuente