Для выполнения отдельного запроса вы можете установить прогноз по критериям в Projection.Distinct. Затем вы включаете столбцы, которые вы хотите вернуть. Затем результат превращается обратно в объект со строгой типизацией, устанавливая преобразователь результата в AliasToBeanResultTransformer - передавая тип, в который должен быть преобразован результат. В этом примере я использую тот же тип, что и сам объект, но вы можете создать другой класс специально для этого запроса.
ICriteria criteria = session.CreateCriteria(typeof(Person));
criteria.SetProjection(
Projections.Distinct(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Property("FirstName"), "FirstName"))
.Add(Projections.Alias(Projections.Property("LastName"), "LastName"))));
criteria.SetResultTransformer(
new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)));
IList<Person> people = criteria.List<Person>();
Это создает SQL, похожий на (по крайней мере, на SQL Server):
SELECT DISTINCT FirstName, LastName from Person
Обратите внимание, что в результате будут заполнены только те свойства, которые вы указали в своей проекции.
Преимущество этого метода заключается в том, что фильтрация выполняется в базе данных, а не возвращает все результаты вашему приложению, а затем выполняет фильтрацию, что является поведением DistinctRootEntityTransformer.