2011-09-19 126 views
1

在我的对象图中,VendorServiceRateChange有一个懒加载属性IList<VendorService> VendorServiceList,VendorService有一个懒加载属性IList<ClientService>NHibernate FetchMode笛卡尔积

当我运行下面的代码时,我的VendorServiceList和我的ClientServiceList之间得到了一个Cartesian产品。

queueList = session 
    .CreateCriteria<VendorRateChange>() 
    .Add(Restrictions.IsNull("ProcessedDate")) 
    .Add(Restrictions.Le("EffectiveDate", DateTime.Now)) 
    .SetFetchMode("VendorServiceList", FetchMode.Join) 
    .SetFetchMode("VendorServiceList.Vendor", FetchMode.Join) 
    .SetFetchMode("VendorServiceList.CityService", FetchMode.Join) 
    .SetFetchMode("VendorServiceList.ClientServices", FetchMode.Join) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .AddOrder(new Order("Audit.CreatedDate", true)) 
    .List<VendorRateChange>(); 

有没有一种方法来组织使用的标准或DetachedCriteria之后,不会导致笛卡尔乘积作为我VendorServiceList此查询?我不希望在初始查询返回后,对“VendorServiceList.ClientServices”上的提取进行注释并使用Initialize调用进行循环。

在此先感谢。

回答

1

在开始创建笛卡尔产品之前,您可以拥有一个FetchMode.Join。如果将其他人切换到FetchMode.Select或其他东西,该怎么办?

+0

不FetchMode.Select使这些属性延迟加载?我的目标是通过一次访问数据库来填充所有值。 – rie819

+1

FetchMode.Select使用另一个Select查询来填充该数据,而不是使用连接。 –

+0

@Cole W谢谢,我只是假设Join意味着渴望而选择意味着懒惰。 – rie819

3

您确定这是一个笛卡尔产品,或者您刚刚收到重复列表中的“重复”行吗? 如果是这样,在.List()之前,尝试呼叫.SetResultTransformer(Transformers.DistinctRootEntity),因为通过提前获取关联的集合,您会收到一个包含相同实体的重复项的列表。

+0

假设它和.SetResultTransformer(新的DistinctRootEntityResultTransformer())一样,那么是的,我已经调用它了。它可能只是重复的行,但它不是重复的根。我在VendorServiceList级别获得额外的行,并且不知道如何清除它们。 – rie819

+0

Hibernate的最新版本:.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); –