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