2010-03-17 44 views
1

我有和实体可以称之为EntityChild集合Children。 我有一个屏幕,其中用户有Entity信息,并有Children集合的列表,但该集合可以变得非常大,所以我在考虑使用分页:获取前20个元素,并延迟加载下一个如果用户明确按下下一个按钮。setfirstresult&setmaxresult在子集合中

所以我在实体库中创建一个函数与此签名:

IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage) 

我需要使用setfirstresult和setmaxresult,而不是在Agregate根实体,但孩子收藏。但是,当我使用这两种配置时,他们总是指向HQL/Criteria查询的实体类型。

其他替代方案是为Child类型创建HQL/Criteria查询,设置最大和第一个结果,然后过滤Entity Children集合中的子查询(通过使用子查询)。 但我无法做到这个过滤器。如果是双向关联(Child引用父实体),则会更容易。

有什么建议吗?

任何

+0

简单,这样的孩子没有FK父?只有一个链接表? – dotjoe 2010-03-17 20:20:53

+0

是的,只有一个链接表 – 2010-03-17 23:13:59

回答

0

一种方法是创建一个由这样一组返回两个表结果的查询。这种方法将允许您在保留起点(实体对象)的同时,对将来自子集合的数据应用分页,并且有一个公共因子(每行中的实体ID)。我的意思是类似的东西:

public IList<object> GetData(int entityID, int actualPage, int numberOfRecordsPerPage) 
     { 
      ICriteria criteria = _repository.Session.CreateCriteria<FlowWhatIfProfile>("entity") 
       .CreateCriteria("Children", "children", NHibernate.SqlCommand.JoinType.InnerJoin) 
       .Add(Restrictions.Eq("children.EntityID", entityID));   

      ProjectionList pl = Projections.ProjectionList(); 
      pl.Add(Projections.GroupProperty("children.Id")); 
      pl.Add(Projections.GroupProperty("children.Property1")); 
      pl.Add(Projections.GroupProperty("children.Property2")); 
      pl.Add(Projections.GroupProperty("children.Property2")); 
      pl.Add(Projections.GroupProperty("entity.Id")); 

      return criteria.SetProjection(pl) 
       .SetFirstResult(actualPage * numberOfRecordsPerPage) 
       .SetFetchSize(numberOfRecordsPerPage) 
       .List<object>(); 
     } 

的缺点将是您返回的数据是数组列表(你将不得不投objectobject[]),但你可以通过使用AliasToBean功能,以免克服NHibernate将这些数组投影到您定义的强类型对象。