2010-06-09 54 views
1

在我的應用程序中,我有一個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放回到我的域模型中。

謝謝

回答

0

我的第一反應是:是的 - 這是它的方式。不做任何事情NHibernate總是試圖加載整個元素 - 這意味着它也加載父元素。這真的是一個性能問題還是僅僅是一個美學問題? 我不認爲包含父ID會幫助你 - 因爲它仍然會加載父項。

但是,如果你真的想優化這個閱讀下面的文章http://www.javalobby.org/java/forums/t20533.html。這是關於Hibernate的,但是它爲您提供了一些關於如何處理這個問題的想法以及針對您的問題的(可能的)解決方案。

+0

我將ParentId添加到我的模型,然後在我的hibernate映射中,將此屬性的插入和更新設置爲false。現在我可以通過id查詢和生成的sql好得多(選擇x,y,z其中parentid == 0)。因爲這個原因,我認爲我可以在我的模型上生存下來。 – 2010-06-10 08:47:23

+0

很好聽,它的工作原理..(我總是使用標準來查詢與NHibernate的數據庫,所以我不是真正的NHibernate.Linq或SQL語句/ NHibernate的專家) – bernhardrusch 2010-06-10 08:53:16