批量大小,用于在nhibernate中高效地集中收集对象图

时间:2012-07-12 23:15:50

标签: nhibernate

我希望有效地加载一组对象。以下代码示例显示了我现在正在做的事情。但是c.CommunicationMethods& c.Roles对象一次加载1个Sql语句。我看到了对包包的提及。 batch-size ...有人可以提供样本映射文件引用吗?这是我最好的选择吗?我可以把循环放在这里吗?批处理我的sql语句?

CommunicationMethods&角色在Contacts映射文件中定义为多对一。

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);
}

1 个答案:

答案 0 :(得分:4)

而不是初始化您可以指定在查询时初始化哪些集合,使用多查询可以将笛卡尔积尽小。

// 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