在我的对象图中,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调用进行循环。
提前致谢。
答案 0 :(得分:3)
您确定它是笛卡尔积,或者您只是在重新调整的列表中收到“重复”行?
如果是这样,在.List()
之前,尝试调用.SetResultTransformer(Transformers.DistinctRootEntity)
,因为通过急切地提取相关集合,您会收到一个包含相同实体重复项的列表。
答案 1 :(得分:1)
在开始创建笛卡尔积之前,您可以拥有一个FetchMode.Join。如果您将其他人切换到FetchMode.Select或其他什么怎么办?