1

我有一个主题图,其中有很多帖子,即……(在底部 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 时,当我在主题上循环时,是否会进行数据库命中以从父主题中获取所有帖子。因此,如果我有 10 个主题,我会在抓取帖子时获得 10 个 DB 点击。

我可以更改此查询以在单个查询中获取帖子吗?我猜某种加入?

4

2 回答 2

1

您可以Fetch.xxxHasMany属性映射上定义急切获取。可用选项Fetch.Join()Fetch.Select()Fetch.SubSelect()。可以在 NHibernate 的文档中找到有关每种获取类型的更多信息。

HasMany(x => x.Posts)
    .Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
    .Fetch.Join()
    .Inverse();
于 2012-07-03T21:58:30.397 回答
0

在我看来,最好的方法是为集合定义一个合理batch-size的(经验法则:您的默认父页面大小)

这样,在获取父项后,您将获得针对您迭代的每个子集合类型的单个查询。

于 2012-07-03T23:33:37.720 回答