2010-03-17 45 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將這些數組投影到您定義的強類型對象。