【问题标题】:Querying a self referencing join with NHibernate Linq使用 NHibernate Linq 查询自引用连接
【发布时间】:2010-06-09 23:08:55
【问题描述】:

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

所以在我的 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。 NHibernate 生成左外连接,而不是简单的“从 parentid = 0 的类别中选择 x,y,z”:

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_ 左外连接类别 parent1_ 在 this_.ParentID = parent1_.CategoryId WHERE this_.ParentID 为空

这似乎并不比我以前的效率低多少。

有没有更好的方法来查询这些自引用连接,因为出于这个原因,很容易将 ParentID 放回我的域模型中。

谢谢

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

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

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

    【讨论】:

    • 我将 ParentId 添加到我的模型中,然后在我的休眠映射中将此属性的插入和更新都设置为 false。现在我可以通过 id 查询并且生成的 sql 更好(选择 x,y,z where parentid == 0)。出于这个原因,我想我可能可以忍受在我的模型上坚持 parentid。
    • 很高兴听到它有效..(我总是使用标准来使用 NHibernate 查询数据库,所以我不是 NHibernate.Linq 或 sql 语句/NHibernate 方面的专家)
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多