LINQ-to-NHibernate:不能将Linq Skip()和Take()与FetchMany一起使用

时间:2012-03-12 14:09:26

标签: nhibernate paging linq-to-nhibernate nhibernate-3 nhibernate-projections

我有这些实体:

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 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)时,它有效! e.g。

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来获取一些行吗?谢谢你的任何建议。


我正在使用NHibernate 3.2 mapping by code

2 个答案:

答案 0 :(得分:1)

问题是nhibernate linq提供程序尚未完全实现。

您可以在 ToList()之后将skip / take调用移动到,但是您将要对整个结果集进行过滤,而不是专门查询与该范围匹配的记录。

或者您可以使用QueryOver&lt;&gt;根据这个答案,api对Take和Skip有适当的支持:https://stackoverflow.com/a/5073510/493

答案 1 :(得分:1)