首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate -获取具有分页子集合的父集合

NHibernate -获取具有分页子集合的父集合
EN

Stack Overflow用户
提问于 2012-04-03 21:57:41
回答 2查看 711关注 0票数 3

我目前正在写一个非常基本的在线论坛,我想检索一个带有分页帖子的子集的线程。所以我的映射是:

代码语言:javascript
复制
<class name="Thread" table="ForumThreads">
    <id name="Id">
        <generator class="identity"></generator>
    </id>

    <property name="Title"></property>

    <bag name="Posts">
        <key column="ThreadID"></key>
        <one-to-many class="Post"/>
    </bag>
</class>

<class name="Post" table="ForumPosts">
    <id name="Id">
        <generator class="identity"></generator>
    </id>

    <property name="Content"></property>

    <many-to-one name="Thread"
                 class="Thread"
                 column="ThreadID">
    </many-to-one>
</class>

我想做这样的事情:

代码语言:javascript
复制
public class Thread
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual IEnumerable<Post> Posts { get; set; }
}

public class Post
{
    public virtual int Id { get; set; }
    public virtual Thread Thread { get; set; }
    public virtual string Content { get; set; }
}

public Thread GetThread(int threadId, int page, int pageSize, out int count)
{
    var session = SessionFactory.CurrentSession;

    // Query to get the thread with a child collection of paged posts. 

    return thread;
}

有没有可能用一个查询就能做到这一点,或者我必须将它一分为二?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 22:35:53

代码语言:javascript
复制
var threadId = ...
session.QueryOver<Thread>
  .Where(thread => thread.Id == threadId)
  .Fetch(thread => thread.Posts).Eager
  .Take(pageSize)
  .Skip(page)
  .TransformUsing(Transformers.DistinctRootEntity)
  .List<Thread>();
票数 3
EN

Stack Overflow用户

发布于 2012-04-04 20:41:27

如果您正在考虑进行数据库级别的分页,那么方法应该是这样的:

  1. 你必须使用集合来支持额外模式的延迟加载
  2. 你可能需要使用一个过滤器来加载集合(但你不能返回线程作为结果,因为如果你试图访问它将加载所有帖子的集合)

公用分发列表GetThreadPosts(int threadId,int page,int pageSize,out int count) { var session = SessionFactory.CurrentSession;Thread pageSize= (Thread )session.Get(typeof(Thread ),threadId);var posts =session.CreateFilter(线程.Posts,"").SetFirstResult((page - 1) * pageSize).SetMaxResults(pageSize).List();return posts;}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9994825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档