功能NHibernate获取的hasMany项目在单查询(Fluent nHibernate Get

2019-10-16 22:44发布

我有有它即很多帖子一个主题地图......(在底部的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 DB命中,因为它抓住的职位。

我可以改变这个查询抢职位,以及在单个查询? 我猜某种加入?

Answer 1:

您可以通过定义预先抓取Fetch.xxxHasMany属性映射。 可用的选项有Fetch.Join() Fetch.Select()Fetch.SubSelect() 每种类型的取更多信息可以在NHibernate的找到文档 。

HasMany(x => x.Posts)
    .Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
    .Fetch.Join()
    .Inverse();


Answer 2:

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

通过这种方式,获取父项目之后,你会为你遍历每个孩子集合类型的单个查询。



文章来源: Fluent nHibernate Getting HasMany Items In Single Query