2

У меня есть эти объекты:LINQ к NHibernate: Невозможно использовать Linq Skip() и Take() с FetchMany

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 с их Keyword с и комментарии -count. Поэтому я стараюсь это:

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.

ответ

1

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

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

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

+0

Благодарю. Итак, как я могу загрузить много-много ассоциаций QueryOver? Метод Fetch просто поддерживает связь «один ко многим» и «один к одному»! Можете ли вы загрузить «post.Keywords» и «post.Comments.Count», пожалуйста? –