在我的应用程序中,我有一个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放回我的域模型是非常诱人的。
由于
答案 0 :(得分:0)
我的第一反应是:是的 - 就是这样。没有做任何事情NHibernate总是试图加载整个元素 - 这意味着它也加载了父元素。这真的是一个性能问题还是仅仅是一个美学问题? 我不认为包含父ID会对你有所帮助 - 因为它仍会加载父项。
但如果你真的想优化这个,请阅读以下文章http://www.javalobby.org/java/forums/t20533.html。它是关于Hibernate的,但它为您提供了一些关于如何处理这个问题以及(可能的)解决方案的想法。