NHibernate-使用分页子集合获取父项

NHibernate-使用分页子集合获取父项,nhibernate,collections,paging,Nhibernate,Collections,Paging,我目前正在编写一个非常基本的在线论坛,我想检索一个包含分页帖子子集合的线程。因此,我的映射是: <class name="Thread" table="ForumThreads"> <id name="Id"> <generator class="identity"></generator> </id> <property name="Title"></property>

我目前正在编写一个非常基本的在线论坛,我想检索一个包含分页帖子子集合的线程。因此,我的映射是:

<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>

我想这样做:

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;
}
公共类线程
{
公共虚拟整数Id{get;set;}
公共虚拟字符串标题{get;set;}
公共虚拟IEnumerable Posts{get;set;}
}
公营职位
{
公共虚拟整数Id{get;set;}
公共虚拟线程线程{get;set;}
公共虚拟字符串内容{get;set;}
}
公共线程GetThread(int threadId、int page、int pageSize、out int count)
{
var session=SessionFactory.CurrentSession;
//查询以获取包含分页帖子子集合的线程。
返回线程;
}
是可以用一个查询来完成这项工作,还是必须将其拆分为两个

谢谢

var threadId=。。。
session.QueryOver
.Where(thread=>thread.Id==threadId)
.Fetch(thread=>thread.Posts).Eager
.Take(页面大小)
.跳过(第页)
.变压器使用(变压器.距离)
.List();

如果您正在考虑进行db级分页,那么这种方法应该是这样的

  • 您必须使用集合来支持额外模式的延迟加载
  • 您可能需要使用筛选器来加载集合(但不能返回线程,因为如果您尝试访问集合,它将加载所有帖子)

    public List GetThreadPosts(int-threadId、int-page、int-pageSize、out-int-count)
    {
    var session=SessionFactory.CurrentSession;
    Thread-Thread=(Thread)session.Get(typeof(Thread),threadId);
    var posts=session.CreateFilter(thread.posts,”).SetFirstResult((第-1页)*pageSize.SetMaxResults(pageSize.List();
    返回岗位;
    }
    

  • 关于这些问题,有一些参考资料:
    var threadId = ...
    session.QueryOver<Thread>
      .Where(thread => thread.Id == threadId)
      .Fetch(thread => thread.Posts).Eager
      .Take(pageSize)
      .Skip(page)
      .TransformUsing(Transformers.DistinctRootEntity)
      .List<Thread>();
    
    public List<Post> GetThreadPosts(int threadId, int page, int pageSize, out int count)
    {
        var session = SessionFactory.CurrentSession;
         Thread thread = (Thread )session.Get(typeof(Thread ), threadId);
         var posts = session.CreateFilter(thread .Posts, "").SetFirstResult((page - 1)  * pageSize).SetMaxResults(pageSize).List();
    
        return posts ;
    }