我有一个亲子关系,我只想返回一位父母并加载所有孩子。我正在使用条件,因为它是一个动态查询。
var messageQueueId = this.GetPropertyName<MessageQueue>(x => x.Id);
var query = _sessionManager.Session.CreateCriteria<MessageQueue>(QUEUE_ALIAS);
query.SetFirstResult(_pageOffset);
query.SetMaxResults(_pageSize);
query.Add(Restrictions.In(messageQueueId, _messageQueueIds));
query.List<MessageQueue>();
这将返回父级(MessageQueue),但不会返回其子级(SearchMatches)。
当我尝试这样做时:
var query = _sessionManager.Session
.CreateCriteria<MessageQueue>(QUEUE_ALIAS)
.CreateAlias(this.GetPropertyName<MessageQueue>(x => x.SearchMatches)
, MATCH_ALIAS, JoinType.LeftOuterJoin);
然后,我让孩子们满载,但我也得到了双亲。我了解为什么会这样。但是,我不明白如何获得第一种情况以自动加载SearchMatches?
这是我的实体:
public class MessageQueue : EntityBase
{
...
public virtual IList<SearchMatch> SearchMatches { get; set; }
...
}
public class SearchMatch : EntityBase
{
...
public virtual MessageQueue MessageQueue { get; set; }
...
}
流利的NHibernate设置为DefaultCascade.All()
。我没有这些对象的其他替代。
我试图使用Inverse()
和Not.LazyLoad()
关闭MessageQueue替代。还尝试从CreateAlias进行EagerLoad。但是我仍然没有得到我需要的东西。
我建议使用该batch-size=""
设置。最终结果将是
1)由我们(query.List<MessageQueue>();
)发出的一个查询,
2)NHibernate然后将使用一个(或仅几个)查询来为每个返回的查询加载集合MessageQueue
。
NHibernate可以有效地使用批处理获取,也就是说,如果访问了一个代理(或集合),NHibernate可以加载多个未初始化的代理。批处理获取是惰性选择获取策略的优化。有两种方法可以调整批处理获取:类和收集级别。
批量获取类/实体更容易理解。假设您在运行时遇到以下情况:在ISession中加载了25个Cat实例,每个Cat都有一个对其所有者Person的引用。Person类与代理lazy =“ true”映射。如果您现在遍历所有cat并在每个cat上调用cat.Owner,则NHibernate将默认执行25条SELECT语句,以检索代理的所有者。您可以通过在Person映射中指定一个批处理大小来调整此行为:
<class name="Person" batch-size="10">...</class>
流利的替代方法是(集合级和班级级)
.BatchSize(25)
还要检查:
注意:最后,作为批处理大小传递的数字(例如25)似乎用作其一半-12。因此,如果您使用25进行分页,请尝试使用
SetBatchSize(50)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句