Функционально они делают то же самое, создают соединение с другим объектом.Единственная разница в том, что они возвращают.JoinQueryOver возвращает новый QueryOver, в котором текущая сущность является присоединенной сущностью, а JoinAlias возвращает исходный QueryOver, в котором текущая сущность является исходной корневой сущностью.
Какой бы из них вы ни использовали, это вопрос личного вкуса: (от 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");
и
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
Функционально одинаковы. Обратите внимание, как котенок Алиаспрямо указывается во втором запросе.