我希望有效地加载一组对象。以下代码示例显示了我现在正在做的事情。但是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);
}
答案 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