2011-07-28 1 views
0

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

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

ответ

1

Если кто-то заинтересован в этом, пожалуйста, прочитайте blog post, что объясняет такое поведение

+0

Вы действительно должны опубликовать соответствующее содержание своего сообщения в блоге на этот ответ –

+0

Вы прочитали сообщение в блоге? Нет ответа ... – Rippo

1

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

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

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

Спасибо за этот ответ, но это будет возвращать дубликаты фильмов, если два актера имена начинаются с буквы 'm%'. Я знаю, что могу использовать '.TransformUsing (CriteriaSpecification.DistinctRootEntity)', но это делает фильтрацию на клиенте. Я особенно хочу разобраться, могу ли я использовать ключевое слово DISTINCT здесь, используя доброту QueryOver! – Rippo

+0

Снова я могу вернуться к HQL, чтобы получить то, что хочу, но я пытаюсь узнать QueryOver немного больше и узнать, где он борется. – Rippo

+0

другой вариант будет подзапросом с идентификаторами qanted Movies, а затем '.Subquery (x => x.Id) .In (подзапрос)' – Firo

Смежные вопросы