2012-01-23 45 views
0

我需要一种方法来使用NHibernate热切地检索某种类型的所有实体的所有子集合。如何急切地获取所有子集合?

我想:

var myObjectList = SessionHolder.Current 
    .CreateCriteria(typeof(MyObject)) 
    .SetFetchMode("Clients", FetchMode.Eager) 
    .SetFetchMode("Locations", FetchMode.Eager) 
    .SetFetchMode("Contracts", FetchMode.Eager) 
    .List<MyObject>(); 

查询应该已返回从数据库中的所有实例MyObject来与自己的藏品即时加载,但它没有工作打算,而是返回更多的对象超过预期。我认为它与n + 1选择问题有关。

我发现this solution检索收藏,但我目前仅限于使用NHibernate 1.2.1.4000所以我不能使用期货。

在发布之前,我做了很多研究,但找不到任何东西。

感谢您的回复!

回答

1

尝试使用不同的结果变压器:

var myObjectList = 
    SessionHolder.Current 
       .CreateCriteria(typeof(MyObject)) 
       .SetFetchMode("Clients", FetchMode.Eager) 
       .SetFetchMode("Locations", FetchMode.Eager) 
       .SetFetchMode("Contracts", FetchMode.Eager) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .List<MyObject>(); 
+0

我测试了它,现在它返回的MyObject实体的权数,但孩子们返回复制的,例如,用于为MyObject的一个实例我有可能在返回客户端列表:客户端1,客户端1,客户端1,客户端2,客户端2,客户端2。任何ideea为什么发生这种情况? –

+0

您可以使用HQL来尝试吗?例如'SessionHolder.Current.CreateQuery(“from MyObject o left join fetch o.Clients left join fetch o.Locations left join fetch o.Contracts”)。SetResultTransformer(new DistinctRootEntityResultTransformer())。List ()' –

+0

当然,我会试一试 –

相关问题