NHibernate FetchMode笛卡尔积

时间:2011-09-19 19:47:20

标签: nhibernate nhibernate-criteria cartesian-product

在我的对象图中,VendorServiceRateChange具有延迟加载的属性IList<VendorService> VendorServiceList,而VendorService具有延迟加载的属性IList<ClientService>

当我运行以下代码时,我在VendorServiceList和ClientServiceList之间获得了一个笛卡尔积。

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>();

有没有办法使用Criteria或DetachedCriteria构建此查询,这不会导致Cartesian产品作为我的VendorServiceList?我不想在初始查询返回后,在“VendorServiceList.ClientServices”上注释并使用Initialize调用进行循环。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您确定它是笛卡尔积,或者您只是在重新调整的列表中收到“重复”行? 如果是这样,在.List()之前,尝试调用.SetResultTransformer(Transformers.DistinctRootEntity),因为通过急切地提取相关集合,您会收到一个包含相同实体重复项的列表。

答案 1 :(得分:1)

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