使用NHibernate Linq查询自引用连接

时间:2010-06-09 23:08:56

标签: nhibernate

在我的应用程序中,我有一个Category域对象。类别具有属性Parent(类型类别)。

所以在我的NHibernate映射中我有:

    <many-to-one name="Parent" column="ParentID"/>

在我切换到NHibernate之前,我的域模型上有ParentId属性(映射到相应的数据库列)。

这样可以轻松查询所有顶级类别(ParentID = 0):

where(c => c.ParentId == 0)

但是,我已经从我的域模型中移除了ParentId属性(因为NHibernate),所以我现在必须执行相同的查询(使用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 Categories this_        left outer join分类parent1_          on this_.ParentID = parent1_.CategoryId WHERE this_.ParentID为空

这似乎没有我以前那么有效率。

是否有更好的方法来查询这些自引用连接,因为由于这个原因,将ParentID放回我的域模型是非常诱人的。

由于

1 个答案:

答案 0 :(得分:0)

我的第一反应是:是的 - 就是这样。没有做任何事情NHibernate总是试图加载整个元素 - 这意味着它也加载了父元素。这真的是一个性能问题还是仅仅是一个美学问题? 我不认为包含父ID会对你有所帮助 - 因为它仍会加载父项。

但如果你真的想优化这个,请阅读以下文章http://www.javalobby.org/java/forums/t20533.html。它是关于Hibernate的,但它为您提供了一些关于如何处理这个问题以及(可能的)解决方案的想法。