使用NHibernate高效返回父记录和子记录

时间:2010-02-07 19:44:41

标签: nhibernate

我正在尝试有效地与父母一起工作子(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很新,所以我完全有可能完全错误。

谢谢,
斯科特

1 个答案:

答案 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>();