2012-04-03 19 views
3

私は現在、非常に基本的なオンラインフォーラムを作成する作業をしており、ページポストの子コレクションを持つスレッドを取得したいと考えています。NHibernate - ページングされた子コレクションを持つ親を取得する

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

は1つのクエリでこれを行うすることが可能であり、または私は2つの中でそれを分割する必要がありますするつもりです?

おかげ

+0

いくつかのリソースは、これらのSOの質問にあります http://stackoverflow.com/q/2430863/654134 http://stackoverflow.com/q/4284438/ 654134 –

答えて

3
var threadId = ... 
session.QueryOver<Thread> 
    .Where(thread => thread.Id == threadId) 
    .Fetch(thread => thread.Posts).Eager 
    .Take(pageSize) 
    .Skip(page) 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List<Thread>(); 
+1

ありがとう、それはトリックです! – Tom

0

あなたはデシベルレベルのページングを行うの考えている場合は、そのアプローチは

  1. あなたは余分なモードで遅延ロードをサポートするために、コレクションを使用する必要があり、このようなものになるだろう
  2. コレクションを読み込むためにフィルタを使用する必要があるかもしれません(ただし、コレクションにアクセスしようとすると、すべての投稿を読み込むようにスレッドを返すことはできません)

    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 ; 
    } 
    
関連する問題