queryover和transformusing失去了延迟加载的能力

时间:2011-07-28 09:03:18

标签: nhibernate distinct queryover

我想尝试将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>();

这个作品给我带来了不同的电影,其中演员以字母'm'开头。现在问题出现了,因为投影是针对DTO的,当我迭代结果并且想要延迟加载孩子时。例如: -

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

Model.ActorList总是NULL,看来投影和使用变换器会丢失延迟加载,因为此方法是为DTO设计的。我有什么选择?

我知道我可以使用子查询或HQL而不是select distinct

2 个答案:

答案 0 :(得分:1)

Transformers.AliasToBean<Movie>()只需创建一个新电影并填写属性。这是一个新的电影,而不是从DB加载,因此不会继承原始电影的集合。 AFAIK AliasToBean将使用投影数据填充ViewModels等。

你不能只使用:

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

答案 1 :(得分:1)

如果其他人对此感兴趣,请阅读解释此行为的blog post