我正在尝试有效地与父母一起工作子(post& tags)实体。可在此处查看代码示例:http://gist.github.com/297464
如果任何Post包含多个标记,则在少于10个不同的Post实体中使用以下结果。
var posts = session
.CreateCriteria<Post>()
.SetMaxResults(10)
.SetFetchMode("Tags", FetchMode.Eager)
.List<Post>();
如果我删除上面的.SetFetchMode行,我会得到我要查找的10条记录,但会查询所有Tag实体,然后在内存中进行过滤。
似乎我应该能够指示NHiberate传递PostIds列表或进行连接。
我对NHiberate很新,所以我完全有可能完全错误。
谢谢,
斯科特
答案 0 :(得分:2)
问题是SetMaxResults不应用于从查询返回的根实体的数量,它被转换为T-SQL TOP(在SqlServer的情况下),它应用于连接查询的结果。由于根实体的每个子项的结果集中都有一行,因此TOP将不具有所需的效果。
要实现对根实体数量的限制,可以使用包含SetMaxResults限制的子查询的连接查询。
// Select the ids of the first ten posts
var subquery = DetachedCriteria.For<Post>()
.SetMaxResults(10)
.SetProjection(Projections.Property("Id"));
// Do a join query with posts and tags, for the posts who's ids are
// in the result of the subquery
var posts = session.CreateCriteria<Post>()
.SetFetchMode("Tags", FetchMode.Join)
.Add(Subqueries.PropertyIn("Id", subquery))
.SetResultTransformer(Transformers.DistinctRootEntity)
.List<Post>();