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