2010-06-09 35 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