我有一个主题地图,里面有很多帖子,...(在底部HasMany(x => x.Posts))
public TopicMap()
{
Cache.ReadWrite().IncludeAll();
Id(x => x.Id);
Map(x => x.Name);
*lots of other normal maps*
References(x => x.Category).Column("Category_Id");
References(x => x.User).Column("MembershipUser_Id");
References(x => x.LastPost).Column("Post_Id").Nullable();
HasMany(x => x.Posts)
.Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
.Inverse();
*And a few other HasManys*
}
我编写了一个查询,它获取最新的分页主题,循环并显示数据和一些帖子数据(如子帖的数量等)。这是查询
public PagedList<Topic> GetRecentTopics(int pageIndex, int pageSize, int amountToTake)
{
// Get a delayed row count
var rowCount = Session.QueryOver<Topic>()
.Select(Projections.RowCount())
.Cacheable().CacheMode(CacheMode.Normal)
.FutureValue<int>();
var results = Session.QueryOver<Topic>()
.OrderBy(x => x.CreateDate).Desc
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.Cacheable().CacheMode(CacheMode.Normal)
.Future<Topic>().ToList();
var total = rowCount.Value;
if (total > amountToTake)
{
total = amountToTake;
}
// Return a paged list
return new PagedList<Topic>(results, pageIndex, pageSize, total);
}
当我在这上面使用SQLProfiler时,我遍历主题是db命中以从父主题中获取所有帖子。因此,如果我有10个主题,我会抓住10个数据库命中,因为它会抓住帖子。
我是否可以更改此查询以在单个查询中抓取帖子?我想某种加入?
答案 0 :(得分:1)
您可以在Fetch.xxx
属性映射上使用HasMany
定义急切提取。可用选项包括Fetch.Join()
,Fetch.Select()
和Fetch.SubSelect()
。有关每种类型提取的更多信息可以在NHibernate的documentation上找到。
HasMany(x => x.Posts)
.Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
.Fetch.Join()
.Inverse();
答案 1 :(得分:0)
在我看来,最好的方法是为集合定义合理的batch-size
(经验法则:默认的父页面大小)
这样,在获取父项后,您将获得针对您迭代的每个子集合类型的单个查询。