2012-07-12 35 views
1

我希望高效地加载对象的集合。以下代码示例显示了我现在正在执行的操作。但c.CommunicationMethods & c.Roles对象一次加载1个Sql语句。我看到提包&批处理大小...有人可以提供示例映射文件引用?这是我最好的选择吗?我可以在这里保留我的循环& batch my sql statements?批处理大小高效地加载在nhibernate中的收集对象图

两种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); 
} 
+0

为什么在查询时不使用预取路径? – Firo 2012-07-13 06:14:09

+0

我不确定你的意思。你的意思是这样的:.SetFetchMode(“CommunicationMethods”,FetchMode.Eager)?如果不是,你能指点我一个例子吗? – 2012-07-13 13:22:52

+0

是的 – Firo 2012-07-13 13:57:53

回答

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