Вы можете создать класс DTO, который вы используете, например, для отчетов / обзоров ...
Этот класс может выглядеть так:
public class PersonView
{
public string Name{ get;set; }
public int NumberOfSubordinates{get;set;}
}
Затем вы создаете запрос Criteria, в котором вы определяете, что хотите получить всех людей.
Однако вы можете указать, что NHibernate не должен возвращать объекты Person, а объекты PersonView. Для того, чтобы сделать это, вам нужно использовать проекцию и AliasToBeanTransformer:
ICriteria crit = new Criteria(typeof(Person));
crit.SetProjection (Projections.ProjectionList()
.Add (Projections.Property("Name"), "Name")
.Add (Projections.Count ("Subordinates"), "NumberOfSubordinates");
crit.SetResultTransformer(Transformers.AliasToBean (typeof(PersonView));
Нечто подобное выше. (Я не проверял вашу конкретную ситуацию).
Затем вам просто нужно сообщить NHibernate о существовании класса PersonView, просто «импортировав» этот класс.
У меня есть один файл hbm.xml, куда я импортирую все свои классы DTO. Это выглядит как
<hibernate-mapping .. >
<import class="PersonView" />
</hibernate-mapping>
Затем NHibernate сгенерирует запрос для ваших критериев, который выглядит примерно так:
SELECT p.Name, COUNT(p.Subordinates) FROM Person
INNER JOIN Subordinates ON Person.PersonId = Subordinates.PersonID
GROUP BY p.Name