1

我想有效地加载一组对象。以下代码示例显示了我现在正在做的事情。但是 c.CommunicationMethods 和 c.Roles 对象一次加载 1 个 Sql 语句。我看到了对袋子和批量大小的引用...有人可以提供示例映射文件引用吗?那是我最好的选择吗?我可以在此处保留循环并批处理我的 sql 语句吗?

CommunicationMethods 和 Roles 都在联系人映射文件中定义为多对一。

NHibernateUtil.Initialize(entity.Collection1);
NHibernateUtil.Initialize(entity.Collection2);

NHibernateUtil.Initialize(entity.Contacts);
foreach (var c in entity.Contacts)
{
NHibernateUtil.Initialize(c.CommunicationMethods);
NHibernateUtil.Initialize(c.Roles);
}
4

1 回答 1

4

而不是 Initialize 您可以指定在查询时要初始化哪些集合,并且使用多查询可以使笛卡尔积保持较小。

// load all collection1 into cache
session.QueryOver<Entity>()
    .Where(filter)
    .Fetch(e => e.Collection1).Eager
    .Future();

// load all collection2 into cache
session.QueryOver<Entity>()
    .Where(filter)
    .Fetch(e => e.Collection2).Eager
    .Future();

var results = session.QueryOver<Entity>()
    .Where(filter)
    .Fetch(e => e.Contacts).Eager
    .Fetch(e => e.Contacts.CommunicationMethods).Eager
    .Fetch(e => e.Contacts.Roles).Eager
    .List();

// results contain all entities with initialised collection1, collection2, contacts, contact.role, contact.CommunicationMethod
于 2012-07-13T14:08:01.153 回答