Funcionalmente, eles fazem a mesma coisa, criam uma junção com outra entidade. A única diferença é o que eles retornam. JoinQueryOver retorna um novo QueryOver com a entidade atual sendo a entidade unida, enquanto JoinAlias retorna o QueryOver original que possui a entidade atual como a entidade raiz original.
O que quer que você use é uma questão de gosto pessoal: (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");
e
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
São funcionalmente iguais. Observe como o kittenAlias é expressamente referenciado na segunda consulta.
Kitten kittenAlias = null;
eCat catAlias = null;
anteriores. Acho que é bagunçado, então não uso aJoinAlias
menos que seja necessário.QueryOver Series - Parte 2: Noções básicas e participação, de Andrew Whitaker, oferece uma explicação muito boa:
fonte