2012-04-03 7 views
3

Ich arbeite gerade daran, ein sehr einfaches Online-Forum zu schreiben, und ich möchte einen Thread mit einer Kindsammlung von seitenweisen Posts abrufen. Also meine Zuordnungen sind:NHibernate - Erhalte Eltern mit ausgelagerter Kindersammlung

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

Und ich möchte etwas tun:

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

Ist es möglich, dies mit einer Abfrage zu tun, oder bin ich werde es spalten in zwei ?

Dank

+0

Es gibt einige Ressourcen auf diesen SO Fragen: http://stackoverflow.com/q/2430863/654134 http://stackoverflow.com/q/4284438/ 654134 –

Antwort

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

Danke, das macht den Trick! – Tom

0

Wenn Sie db Level Paging zu tun denken, dann wäre der Ansatz so etwas wie dieses,

  1. Sie haben die Sammlung verwenden träges Laden mit zusätzlichen Modus zu unterstützen
  2. Möglicherweise müssen Sie einen Filter verwenden, um die Sammlung zu laden (aber Sie können nicht Thread als Ergebnis zurückgeben, als ob Sie versuchen, auf die Sammlung zuzugreifen, wird es alle Beiträge laden)

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