在我的应用程序中,我有一个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放回到我的域模型中。
谢谢
我将ParentId添加到我的模型,然后在我的hibernate映射中,将此属性的插入和更新设置为false。现在我可以通过id查询和生成的sql好得多(选择x,y,z其中parentid == 0)。因为这个原因,我认为我可以在我的模型上生存下来。 – 2010-06-10 08:47:23
很好听,它的工作原理..(我总是使用标准来查询与NHibernate的数据库,所以我不是真正的NHibernate.Linq或SQL语句/ NHibernate的专家) – bernhardrusch 2010-06-10 08:53:16