Ответ 1
После дальнейших исследований по этому поводу; это возможно (хотя и не очевидно) для достижения строго типизированного способа, используя QueryOver. Хитрость заключается в использовании внешних переменных псевдонимов Query в сочетании с WithAlias и TransformUsing. Вот пример, который делает левое соединение с фильтрацией и сортировкой.
// Query alias variables
entityTypeA anchorType = null;
entityTypeB joinedType = null;
var items = session.Query<entityTypeA>( ()=>anchorType )
.Left.JoinAlias(() => anchorType.FieldName, () => joinedType)
.WithSubquery.WhereProperty(e => e.FieldD).In(myFilterList)
// bind property mappings using WithAlias
.SelectList(list => list
.Select(e => e.FieldNameA).WithAlias( ()=> anchorType.FieldNameA )
.Select(e => e.FieldNameB).WithAlias( ()=> anchorType.FieldNameB )
)
.OrderBy(e => joinedType.FieldNameC).Desc
.TransformUsing(Transformers.AliasToBean<entityTypeA>()) // transform result to desired type.
.List<entityTypeA>();