queryover и transformusing теряет способность ленивой нагрузки - PullRequest
0 голосов
/ 28 июля 2011

Я хочу попробовать ввести ключевое слово DISTINCT в SQL, в основном мне требуется следующий SQL: -

SELECT distinct this_.Id          as y0_,
                this_.Name        as y1_,
                this_.Description as y2_,
                this_.UnitPrice   as y3_,
                this_.Director    as y4_
FROM   Product this_
       inner join ActorRole actor1_
         on this_.Id = actor1_.MovieId
WHERE  this_.ProductType = 'Movie'
       AND actor1_.Name like 'm%' /* @p0 */

Код QueryOver выглядит следующим образом, однако я не могу использовать ключевое слово DISTINCT без использования проекции: -

var movie = Session.QueryOver<Movie>()
  .JoinQueryOver<Actor>(m => m.ActorList).Where(a => a.Name.IsLike("m%"))
  .Select(
    Projections.Distinct(
      Projections.ProjectionList()
        .Add(Projections.Property<Movie>(w => w.Id))
        .Add(Projections.Property<Movie>(w => w.Name))
        .Add(Projections.Property<Movie>(w => w.Description))
        .Add(Projections.Property<Movie>(w => w.UnitPrice))
        .Add(Projections.Property<Movie>(w => w.Director))
      )
   )
   .TransformUsing(Transformers.AliasToBean<Movie>());
return movie.List<Movie>();

Эта работа возвращает мне отличные фильмы, где актеры начинаются с буквы «м». Теперь проблема заключается в том, что проекция предназначена для DTO и когда я перебираю результаты и хочу лениво загрузить детей. Например: -

@foreach (var item in Model.ActorList)
{
  <li>@(item.Name) <em>plays</em> @item.Role</li>
}

Model.ActorList всегда NULL, кажется, что проецирование и использование трансформатора теряет ленивую нагрузку, так как этот метод предназначен для DTO. Какие у меня варианты?

Я знаю, что могу использовать подзапрос или HQL вместо select distinct

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Если кому-то еще это интересно, прочтите сообщение в блоге , в котором объясняется это поведение

1 голос
/ 28 июля 2011

Transformers.AliasToBean<Movie>() просто создает новый фильм и заполняет свойства.Поэтому для него новый фильм и не загружается из БД, и поэтому он не наследует коллекцию исходного фильма.AFAIK AliasToBean предназначен для заполнения ViewModels и т. Д. Проецируемыми данными.

Разве вы не можете просто использовать:

Session.QueryOver<Movie>()
  .JoinQueryOver<Actor>(m => m.ActorList).Where(a => a.Name.IsLike("m%"))
  .List();
...