2010-03-26 38 views
2

我有一个NHibernate的查询,看起来像这样:如何实现分页NHibernate的与左连接查询

 var query = Session.CreateQuery(@" 
       select o 
       from Order o 
       left join o.Products p 
       where 
       (o.CompanyId = :companyId) AND 
       (p.Status = :processing) 
       order by o.UpdatedOn desc") 
       .SetParameter("companyId", companyId) 
       .SetParameter("processing", Status.Processing) 
       .SetResultTransformer(Transformers.DistinctRootEntity); 

     var data = query.List<Order>(); 

我想实现分页此查询,所以我只返回X行,而不是整个的结果集。

我知道SetMaxResults()SetFirstResult(),但由于left joinDistinctRootEntity,这可能会返回少于x订单。

我试图"select distinct o"为好,但这是生成(使用SQLSERVER 2008方言)的SQL似乎忽略distinct的第一个页面后(我认为this是问题)。

完成此操作的最佳方法是什么?

回答

1

使用SetResultTransformer(Transformers.AliasToBean())并获取不是实体的数据。

另一种解决方法是更改​​查询。 正如我看到你正在返回有正在处理的产品的订单。 所以你可以使用exists语句。在13.11查看nhibernate手册。子查询。

+0

'存在'的想法很有趣......我会试试看。 – 2010-03-26 23:02:00

2

在这种情况下,最好做在两个查询,而不是一个:

  1. 负载订单的页面,而无需加入
  2. 加载这些订单与他们的产品,使用in操作

有一个稍微复杂的例子http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

+0

对于第二步,我想你会手动建立第一步结果中的ID列表。还是有更好/更简洁的方式? – 2014-03-19 11:24:32

+0

@evanhaas这可能是我4年前的意思:-)但我认为你可以使用子查询和HQL分页。 – 2014-03-19 11:33:46