LINQ-to-NHibernate: нельзя использовать Linq Skip () и Take () с FetchMany - PullRequest
2 голосов
/ 12 марта 2012

У меня есть следующие объекты:

public class BlogPost {
    public virtual int Id { get; set; }
    public virtual IList<Keyword> Keywords { get; set; }
    public virtual IList<BlogComment> Comments { get; set; }
}

public class BlogComment {
    public virtual int Id { get; set; }
    public virtual BlogPost Post { get; set; }
}

public class Keyword {
    public virtual int Id { get; set; }
    public virtual IList<BlogPost> BlogPosts { get; set; }
}

Я хочу загрузить выгружаемый список из BlogPost s по их Keyword s и количеству комментариев.Поэтому я пробую это:

var entities = session.Query<BlogPost>()
    .Where(t => t.Published)
    .FetchMany(t => t.Keywords)
    .OrderByDescending(t => t.UpdatedAt)
    .Skip((pageNumber - 1) * pageSize).Take(pageSize)
    .Select(t => new {
        CommentsCount = t.Comments.Count(),
        Post = t
    })
    .ToList();

Но возникает следующая ошибка:

Указанный метод не поддерживается.

И когда я удаляю .Skip((pageNumber - 1) * pageSize).Take(pageSize), он работает!например,

var entities = session.Query<BlogPost>()
    .Where(t => t.Published)
    .FetchMany(t => t.Keywords)
    .OrderByDescending(t => t.UpdatedAt)
    // remove the below line
    //.Skip((pageNumber - 1) * pageSize).Take(pageSize)
    .Select(t => new {
        CommentsCount = t.Comments.Count(),
        Post = t
    })
    .ToList();

Есть ли у вас какие-нибудь идеи, пожалуйста, взять несколько строк, включая Keyword s?Спасибо за любое предложение.


Я использую NHibernate 3.2 mapping by code.

Ответы [ 2 ]

1 голос
/ 03 января 2014

Теперь это должно поддерживаться в 3.3.3.GA

http://sourceforge.net/p/nhibernate/news/2013/03/nhiberate-333ga-released/

1 голос
/ 12 марта 2012

Проблема в том, что провайдер nhibernate linq еще не полностью реализован.

Вы можете переместить вызовы пропустить / принять на после ToList (), но тогда выбудет фильтрация по всему набору результатов, а не запросы специально для записей, соответствующих этому диапазону.

В качестве альтернативы вы можете использовать QueryOver <> api, который имеет надлежащую поддержку Take и Skip согласно этому ответу: https://stackoverflow.com/a/5073510/493

...