我的問題是非常相似,這一個(這是不是真的回答):Nhibernate: distinct results in second level Collection加載多層次的收藏NHibernate的
我有這樣的對象模型:
class EntityA
{
...
IList<EntityB> BList { get; protected set; }
...
}
class EntityB
{
... does NOT reference its parent EntityA...
IList<EntityC> CList { get; protected set; }
}
他們是一一對多關係。 EntityB和C do 不是有一個對它的父對象的對象引用。
我想通過執行類似下面的三個SQL查詢,以避免笛卡兒完全加載集合聯接:
SELECT id, ... FROM EntityA;
SELECT id, idA, ... FROM EntityB;
SELECT id, idB, ... FROM EntityC;
隨即,DAL具有的所有信息填寫正確的對象。但是由於EntityB不知道其父母是誰,所以有作爲nHibernate負責正確填寫收集。
可以這樣做嗎?
我可以做到這一點的解決方法與笛卡爾乘積,但它需要修改我的模型,以提供一個集合setter和有資格爲在我腦海中的技術問題與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();
}
}
這不會是笛卡爾產品。它只是很多複製的數據。對於每個額外的EntityC EntityB複製實體B,由於ResultTransformer,這將是很好的。你可以通過將該集合作爲ISet <>來避免那些被騙的EntityB。儘管如此,它仍然有很多額外的數據。 – dotjoe
事實上,你說的不是笛卡兒的產品,因爲它不是N對N,對此抱歉。 ISet是無序的,所以對於我的方案來說這不是一個真正的選擇。 – dstj