NHibernate - Получить родитель с постраничной дочерней коллекцией - PullRequest
3 голосов
/ 03 апреля 2012

В настоящее время я работаю над написанием очень простого онлайн-форума и хочу получить ветку с дочерней коллекцией постатейных постов.Итак, мои отображения:

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

Возможно ли это сделать с помощью одного запроса, или мне придется разделитьэто до двух?

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012
var threadId = ...
session.QueryOver<Thread>
  .Where(thread => thread.Id == threadId)
  .Fetch(thread => thread.Posts).Eager
  .Take(pageSize)
  .Skip(page)
  .TransformUsing(Transformers.DistinctRootEntity)
  .List<Thread>();
0 голосов
/ 04 апреля 2012

Если вы думаете о разбиении на страницы уровня базы данных, то подход будет примерно таким:

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