如何急切加载列表/集合中的对象?

2024-04-08

我有以下查询:

ObjectB objectBAlias = null;
ObjectC objectCAlias = null;
var query = session.QueryOver<ObjectA>();
var results = query
    .JoinAlias(x => x.listOfBs, () => objectBAlias)
    .JoinAlias(x => objectBAlias.ObjectC, () => objectCAlias)
    .TransformUsing(new DistinctRootEntityResultTransformer())
    .List<ObjectA>();

class ObjectA
{
    IList<ObjectB> listOfBs;
}

class ObjectB
{
    ObjectA a;
    ObjectC c;
}

class ObjectC
{
    int x;        
}

对象A有一个many-to-many与 ObjectS 的关系,其中 Object 是连接表。对象A有一个对象列表,对象B有一个对象C的属性。我正在尝试立即加载 ObjectC 但没有成功。

我让所有 ObjectC 立即加载的唯一方法是这样做:

foreach (ObjectA a in results)
{
    foreach (var b in a.listOfBs)
    {
        NHibernateUtil.Initialize(b.c);
    }
}

但这似乎不太适合扩展。


我建议 - 不要尝试(多对多的热切加载)。相反 - 使用内置功能:

19.1.5。使用批量抓取 http://nhibernate.info/doc/nh/en/index.html#performance-fetching-batch

NHibernate 可以高效地利用批量抓取,也就是说,如果访问一个代理(或集合),NHibernate 可以加载多个未初始化的代理(或集合)。批量抓取是对惰性选择抓取策略的一种优化。有两种方法可以调整批量抓取:类别和收藏级别。

要获取更多详细信息,请检查以下内容:

  • 如何在 NHibernate 中热切加载关联而不重复? https://stackoverflow.com/q/20970680/1679310
  • NHibernate Fetch/FetchMany 结果集中重复,如何使用 ToFuture() 修复 https://stackoverflow.com/q/28348830/1679310

获取集合是一项困难的操作。它有很多副作用(正如您所意识到的,当获取更多集合时)。但即使获取一个集合,我们也会加载许多重复的行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何急切加载列表/集合中的对象? 的相关文章

随机推荐