Чтобы выполнить отдельный запрос, вы можете установить проекцию по критериям в 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.
SwitchToThisWindow () вообще не является устаревшим.
Я использую его в производственной среде 14 лет.
Посмотрите исходный код Windows, и вы увидите, что он называется везде ...