如何在列表/集合中加载对象?

时间:2015-09-22 15:49:45

标签: nhibernate nhibernate-mapping queryover

我有以下查询:

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

ObjectA与ObjectC的关系为many-to-many,ObjectB为连接表。 ObjectA有一个ObjectB列表,而ObjectB有一个ObjectC的比例。我试图加载ObjectC,但没有成功。

我将所有ObjectC充分加载的唯一方法就是这样做:

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

但这似乎并不像是可以扩展的东西。

1 个答案:

答案 0 :(得分:1)

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

19.1.5. Using batch fetching

  

NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是懒惰选择提取策略的优化。有两种方法可以调整批处理获取:在类和集合级别上。

要了解更多详情,请查看以下内容:

  

获取收藏是一项艰难的操作。它有很多副作用(正如你所知,当有更多的集合时)。但即使提取了一个集合,我们也会加载许多重复的行。