Nhibernate 使用NHiberate有效地返回父记录和子记录

Nhibernate 使用NHiberate有效地返回父记录和子记录,nhibernate,Nhibernate,我正在尝试有效地处理父&子(post&tags)实体。下面可以看到代码示例: 如果任何Post包含超过1个标记,则使用以下结果将导致少于10个不同的Post实体 var posts = session .CreateCriteria<Post>() .SetMaxResults(10) .SetFetchMode("Tags", FetchMode.Eager) .List<Post>(); var posts=会话 .CreateCri

我正在尝试有效地处理父&子(post&tags)实体。下面可以看到代码示例:

如果任何Post包含超过1个标记,则使用以下结果将导致少于10个不同的Post实体

var posts = session
    .CreateCriteria<Post>()
    .SetMaxResults(10)
    .SetFetchMode("Tags", FetchMode.Eager)
    .List<Post>();
var posts=会话
.CreateCriteria()
.SetMaxResults(10)
.SetFetchMode(“标记”,FetchMode.Eager)
.List();
如果我删除上面的.SetFetchMode行,我会得到我要查找的10条记录,但所有标记实体都会被查询,然后在内存中过滤

看来我应该能够指示NHiberate要么通过一个帖子列表,要么加入

我对NHiberate还很陌生,所以也完全有可能我在这方面完全错了

谢谢,

Scott

问题在于SetMaxResults不应用于从查询返回的根实体数,它被转换为T-SQL TOP(在SqlServer的情况下),应用于连接查询的结果。由于根实体的每个子实体的结果集中都有一行,因此顶部不会产生所需的效果

要实现对根实体数量的限制,可以将联接查询与包含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>();
//选择前十篇文章的ID
var subquery=DetachedCriteria.For()
.SetMaxResults(10)
.SetProjection(Projections.Property(“Id”));
//对帖子和标签执行连接查询,因为帖子的ID是
//在子查询的结果中
var posts=session.CreateCriteria()
.SetFetchMode(“标记”,FetchMode.Join)
.Add(子查询.PropertyIn(“Id”,子查询))
.SetResult变压器(变压器距离)
.List();

可能不会影响此特定情况,但您在标记集合上有inverse=“true”,但另一侧(标记的帖子集合)被注释掉。你只想在不拥有该系列的一侧使用反向。谢谢你的提示。这离我想要实现的目标更近了。不幸的是,它返回了一个原始的每个标记,但最终结果现在与我希望实现的目标一致。最后,我想我只是想让标签被延迟加载(和缓存),但很高兴知道这是一个选项。谢谢代码中的“标记”是一个神奇的字符串。有没有办法避免使用神奇的字符串,并且能够利用重构工具中的“重命名”功能?