Безразлично, первый запрос выполняет четкое разделение после извлечения всех строк, в то время как второй запрос фактически выполняет select distinct ...
. Вероятно, происходит то, что она гидратирует модель Employee только одним полученным навыком
Чтобы первый запрос действительно сделал select distinct ...
, вам нужно использовать проекции.
Что-то вроде
Session.CreateCriteria(Of Employee)() _
.CreateAlias("Skills", "s", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Expression.Or(Expression.Eq("PrimarySkillId", sId),
Expression.Eq("s.Id", sId))) _
.SetProjection(Projections.Distinct("Id")) _
.SetFetchMode("s", FetchMode.Eager)
может работать. В качестве альтернативы вы можете попробовать установить режим выборки с помощью DistinctRootEntityResultTransformer
Session.CreateCriteria(Of Employee)() _
.CreateAlias("Skills", "s", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Expression.Or(Expression.Eq("PrimarySkillId", sId),
Expression.Eq("s.Id", sId))) _
.SetResultTransformer(Transformers.DistinctRootEntityResultTransformer) _
.SetFetchMode("s", FetchMode.Eager)