NHibernate и Коллекция рассчитывает - PullRequest
4 голосов
/ 10 февраля 2009

У меня есть следующие настройки класса для персистентности с использованием NHibernate

public class Person
{
    public string Name { get; set; }
    public IList<Person> Subordinates { get; set; }
}

Теперь скажите, что у меня есть сетка с двумя столбцами «Имя» и «Число подчиненных», что является лучшим способом сделать это в NHibernate, при этом сохраняя использование доменных объектов, где это возможно.

Спасибо

Ответы [ 2 ]

10 голосов
/ 10 февраля 2009

Вы можете создать класс 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
0 голосов
/ 10 февраля 2009

Предполагая, что HBM исправляет подчиненных лиц HasMany, вы можете просто вызвать человека и затем вызвать Subordinates.Count

Это умеренно расточительный процесс, если все, что вам нужно, это счетчик, так как он полностью заполнит всю коллекцию подчиненных, чтобы просто подсчитать вам счет. Я думаю, вам лучше создать метод, который принимает Person и возвращает вам счет их подчиненных, а вы используете HQL для выполнения функции действительного счета. Если вы не можете сделать функцию прямого подсчета, вы можете заставить ее возвращать только одно значение для каждого подчиненного, которое соответствует Person FK, а затем вызывать .Length или .Count в коллекции, которую она возвращает. Однако я предполагаю, что HQL должен быть в состоянии рассчитать это непосредственно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...