使用NHibernate Linq查询自引用联接

使用NHibernate Linq查询自引用联接,nhibernate,Nhibernate,在我的应用程序中,我有一个类别域对象。类别具有类别类型的属性父级 因此,在我的NHibernate映射中,我有: <many-to-one name="Parent" column="ParentID"/> 但是,由于NHibernate的原因,我已经从域模型中删除了ParentId属性,因此我现在必须使用NHibernate.Linq执行相同的查询,如下所示: public IList<Category> GetCategories(int p

在我的应用程序中,我有一个类别域对象。类别具有类别类型的属性父级

因此,在我的NHibernate映射中,我有:

    <many-to-one name="Parent" column="ParentID"/>
但是,由于NHibernate的原因,我已经从域模型中删除了ParentId属性,因此我现在必须使用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();
    }
从这个类别_ 左外部联接类别父级1_ 在此上,ParentID=parent1\u1.CategoryId 其中,此\uu.ParentID为null

这看起来并没有比我以前的效率低多少

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


谢谢

我的第一反应是:是的,就是这样。NHibernate总是尝试加载整个元素,这意味着它也加载父元素。这真的是一个性能问题还是一个美学问题? 我不认为包含父id会对您有所帮助,因为它仍然会加载父项


但是如果你真的想优化它,请阅读下面的文章。它是关于Hibernate的,但它为您提供了一些有关如何处理此问题以及可能的问题解决方案的想法。

我将ParentId添加到模型中,然后在Hibernate映射中将此属性的insert和update设置为false。现在我可以按id进行查询,生成的sql更好地选择x、y、z,其中parentid==0。因为这个原因,我想我可能可以在我的模型上粘贴parentid。。我总是使用criterias查询NHibernate数据库,所以我不是NHibernate.Linq或sql语句/NHibernate的专家
        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();
    }
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_