我的问题与这个问题非常相似(没有真正回答):Nhibernate: distinct results in second level Collection
我有这个对象模型:
class EntityA
{
...
IList<EntityB> BList { get; protected set; }
...
}
class EntityB
{
... does NOT reference its parent EntityA...
IList<EntityC> CList { get; protected set; }
}
它们是一对多的关系。EntityB 和 C没有对其父对象的对象引用。
我想通过执行以下三个 SQL 查询来完全加载集合,以避免笛卡尔连接:
SELECT id, ... FROM EntityA;
SELECT id, idA, ... FROM EntityB;
SELECT id, idB, ... FROM EntityC;
这样,DAL 就拥有了正确填充对象的所有信息。但是由于 EntityB 不知道它的父级是谁,所以必须由 nHibernate 负责正确地填充集合。
能做到吗??
我可以用笛卡尔积来解决这个问题,但它需要修改我的模型以提供一个集合设置器,并且在我看来,它可以作为 DAL 技术问题的补丁。
ICriteria criteria = session.CreateCriteria<EntityA>()
.SetFetchMode("BList", FetchMode.Join)
.SetFetchMode("BList.CList", FetchMode.Join)
.SetResultTransformer(new DistinctRootEntityResultTransformer());
IList<EntityA> listA = criteria.List<EntityA>();
foreach (EntityA objA in listA) {
objA.BList = objA.BList.Distinct().ToList();
foreach (EntityB objB in objB.BList) {
objB.CList = objB.CList.Distinct().ToList();
}
}