在我的應用程序中,我有一個Category域對象。類別有一個屬性Parent(類型類別)。查詢使用NHibernate的自引用加入Linq
所以在我的NHibernate映射我有:
<many-to-one name="Parent" column="ParentID"/>
之前,我切換到NHibernate的我對我的域模型(映射到相應的數據庫列)的ParentId屬性。現在
where(c => c.ParentId == 0)
但是,因爲我已經刪除從我的域模型(因爲NHibernate的的)的的ParentId屬性,所以我:
這使得它很容易查詢說所有的頂級類別(PARENTID = 0)必須做同樣的查詢(使用NHibernate.Linq),像這樣:
public IList<Category> GetCategories(int parentId) {
if (parentId == 0)
return _catalogRepository.Categories.Where(x => x.Parent == null).ToList();
else
return _catalogRepository.Categories.Where(x => x.Parent.Id == parentId).ToList();
}
真正的影響,我可以看到,是生成的SQL。而不是簡單的 '選擇的x,y,z的其中的parentId = 0類別' NHibernate的生成左外連接:
SELECT this_.CategoryId as CategoryId4_1_,
this_.ParentID as ParentID4_1_,
this_.Name as Name4_1_,
this_.Slug as Slug4_1_,
parent1_.CategoryId as CategoryId4_0_,
parent1_.ParentID as ParentID4_0_,
parent1_.Name as Name4_0_,
parent1_.Slug as Slug4_0_
FROM分類THIS_ 左外連接關鍵字上this_.ParentID = parent1_.CategoryId parent1_ WHERE this_.ParentID爲空
這似乎不像我以前那樣有效率低。
是否有更好的方式來查詢這些自引用連接,因爲由於這個原因,很容易將ParentID放回到我的域模型中。
謝謝
我將ParentId添加到我的模型,然後在我的hibernate映射中,將此屬性的插入和更新設置爲false。現在我可以通過id查詢和生成的sql好得多(選擇x,y,z其中parentid == 0)。因爲這個原因,我認爲我可以在我的模型上生存下來。 – 2010-06-10 08:47:23
很好聽,它的工作原理..(我總是使用標準來查詢與NHibernate的數據庫,所以我不是真正的NHibernate.Linq或SQL語句/ NHibernate的專家) – bernhardrusch 2010-06-10 08:53:16