我有一个父子关系,我想只返回一个父母并加载所有孩子。我正在使用标准,因为它是一个动态查询。
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; }
...
}
Fluent NHibernate设置为DefaultCascade.All()
。我没有其他替代这些对象。
我尝试使用MessageQueue覆盖的Inverse()
和Not.LazyLoad()
。还试图从CreateAlias的EagerLoad。但我仍然没有得到我需要的东西。
答案 0 :(得分:2)
我建议使用 batch-size=""
设置。它将最终出现在
1)我们发出的一个查询(query.List<MessageQueue>();
),
2)NHibernate将使用一个(或几个)查询来为每个返回的MessageQueue
加载集合。
NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是懒惰选择提取策略的优化。有两种方法可以调整批处理获取:在类和集合级别上。
更容易理解批量提取类/实体。想象一下,您在运行时遇到以下情况:您在一个ISession中加载了25个Cat实例,每个Cat都有一个对其所有者的引用,一个Person。 Person类使用代理映射,lazy =“true”。如果您现在遍历所有猫并在每个猫上调用cat.Owner,NHibernate将默认执行25个SELECT语句,以检索代理所有者。您可以通过在Person:
的映射中指定批量大小来调整此行为
<class name="Person" batch-size="10">...</class>
流利的替代方案是(收集和班级)
.BatchSize(25)
同时检查:
注意:最后,作为批量大小传递的数字,例如25,似乎用作它的一半 - 12.所以,如果你的分页大小为25,请尝试使用
SetBatchSize(50)