NHibernate AliasToBeanResultTransformer & Collections - PullRequest
3 голосов
/ 15 июня 2011

Я хотел бы вернуть DTO из моего уровня данных, который также содержал бы дочерние коллекции ... например, так:

Audio
 - Title
 - Description
 - Filename
 - Tags
     -  TagName
 - Comments
     -  PersonName
     -  CommentText

Вот базовый запрос, но я не уверен, как преобразовать дочерние коллекции из моей сущности в DTO.

var query = Session.CreateCriteria<Audio>("audio")
            .SetProjection(
                Projections.ProjectionList()
                    .Add(Projections.Property<Audio>(x => x.Title))
                    .Add(Projections.Property<Audio>(x => x.Description))
                    .Add(Projections.Property<Audio>(x => x.Filename))
            ).SetResultTransformer(new AliasToBeanResultTransformer(typeof(AudioDto)))
            .List<AudioDto>();

Возможно ли это вообще, или есть другой рекомендуемый способ сделать это?

UPDATE : Просто хочу добавить немного больше информации о моем сценарии ... Я хочу вернуть список элементов Audio для текущего вошедшего в систему пользователя вместе с некоторыми связанными объектами, такими как теги, комментарии и т. Д., - это довольно просто, используя MultiQuery / Будущее.

Тем не менее, при отображении аудио элементов пользователю, я также хочу отобразить 3 других параметра для пользователя:

  • Погода они добавили этот аудио пункт в свой список избранного
  • Погода, которую они дали этому аудио 'thumbs up'
  • Погода вошедший в систему пользователь 'Follow' владелец этого аудио
Favourites : Audio -> HasMany -> AudioUserFavourites

Thumbs Up : Audio -> HasManyToMany -> UserAccount

Following Owner : Audio -> References -> UserAccount ->

ManyToMany -> UserAccount

Надеюсь, что это имеет смысл ... если нет, я попытаюсь объяснить еще раз ... как я могу загрузить эти дополнительные детали для каждого возвращаемого объекта Audio ... Мне также нужна вся эта информация на страницах 20 *. 1028 *

Я посмотрел на пакетную загрузку, но, похоже, он выбирает ВСЕ большие пальцы для каждого объекта Audio, а не проверяет, пролистал ли его только зарегистрированный пользователь.

Извините за бессвязные: -)

Пол

1 Ответ

2 голосов
/ 15 июня 2011

Если вы хотите получить свои Audio объекты с заполненной коллекцией Tags и Comments, загляните в блог Aydende Rahien: http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate.

Вам не нужно использовать DTO для этого; Вы можете получить список Audio с его коллекциями, даже если коллекции по умолчанию загружаются лениво. Вы бы создали два будущих запроса; первый будет извлекать аудио, присоединенное к тегам, а второй - аудио, присоединенное к комментариям. Это работает, потому что к моменту обработки второго результата запроса кеш сеанса уже содержит объекты Audio; NHibernate извлекает Audio из кеша вместо его регидратации, а затем заполняет вторую коллекцию.

Вам не нужно использовать будущие запросы для этого; он по-прежнему работает, если вы просто выполняете два запроса последовательно, но использование фьючерсов приведет только к одному обращению к базе данных, что сделает его быстрее.

...