我有这个架构:
我已经在Post
和Tag
之间完成了ManyToMany映射。我想要实现的是获取帖子列表和每个帖子的子标签集合。所以它可以这样显示:
到目前为止,我所做的是:
IList<Post> results = base._session.CreateCriteria(typeof(Post))
.SetFetchMode("User", FetchMode.Eager)
.SetFetchMode("Votes", FetchMode.Eager)
.AddOrder(Order.Desc("_dateCreated"))
.ToList();
但是对于每个Post
,它都需要额外的1个SQL来获取Votes
。
有没有办法一次性获取它?
答案 0 :(得分:1)
这种情况下的解决方案可能/应该是批量提取。在这里:19.1.5. Using batch fetching您可以找到更多详细信息。
您必须使用属性batch-szie="25"
标记您的馆藏和/或实体。
的xml:
<bag name="Tags" ... batch-size="25">
...
流利:
HasManyToMany(x => x.Tags)
...
.BatchSize(25)
那仍然会执行一些SQL Select语句,而不仅仅是一个,但是你获得的灵活性会很大。
在这里,我试图解释为什么批量提取是正确的方法:NHibernate QueryOver with Fetch resulting multiple sql queries and db hits
最后,我们可以使用简单查询(非显式提取),因为batch-size
将减少为获得所有需要的延迟加载而发出的SQL语句数量......