渴望用NHibernate加载儿童集合

Kri*_*fer 24 nhibernate querying eager-loading

我想加载根实体并急切加载它的所有子集合和聚合成员.

一直试图SetFetchMode在FluentNHibernate中使用它,但我在其中一个子集合中得到重复,因为我有3个级别的深度.DistinctRootEntityResultTransformer遗憾的是,只删除了根重复.

return Session.CreateInvoiceBaseCriteria(query, archived)
    .AddOrder(new Order(query.Order, query.OrderType == OrderType.ASC))
    .SetFetchMode("States", FetchMode.Eager)
    .SetFetchMode("Attestations", FetchMode.Eager)
    .SetFetchMode("AttestationRequests", FetchMode.Eager)
    .SetFetchMode("AttestationRequests.Reminders", FetchMode.Eager)
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Invoice>();
Run Code Online (Sandbox Code Playgroud)

我可以使用多个查询或类似的东西来存档吗?

此外,这种方法不会导致数据库中不必要的巨大结果集吗?

有什么建议?

Kri*_*fer 8

找到了一个解决方案,但它并不漂亮.首先,我找到所有的Invoice ID,然后在multiquery中使用它们,然后在最后通过HashedSet过滤结果.由于有大量的项目,我有时无法使用normalt Restriction.In并被迫将其作为字符串发送.

任何建议的调整?

var criteria = Session.CreateInvoiceBaseCriteria(query, archived)
    .SetProjection(Projections.Id());

var invoiceIds = criteria.List<int>();
if (invoiceIds.Count > 0)
{
    var joinedIds = JoinIDs(criteria.List<int>()); // To many ids to send them as parameters.

    var sql1 = string.Format("from Invoice i inner join fetch i.States where i.InvoiceID in ({0}) order by i.{1} {2}", joinedIds, query.Order, query.OrderType.ToString());
    var sql2 = string.Format("from Invoice i inner join fetch i.AttestationRequests where i.InvoiceID in ({0})", joinedIds);
    var sql3 = string.Format("from Invoice i inner join fetch i.Attestations where i.InvoiceID in ({0})", joinedIds);

    var invoiceQuery = Session.CreateMultiQuery()
        .Add(sql1)
        .Add(sql2)
        .Add(sql3);

    var result = invoiceQuery.List()[0];

    return new UniqueFilter<Invoice>((ICollection)result);
}

return new List<Invoice>();
Run Code Online (Sandbox Code Playgroud)


tma*_*hek 0

虽然它可能不完全是您正在寻找的内容,但我建议您查看这篇文章:

急切加载具有许多子集合的聚合

如果您浏览该网站的其余部分,您会发现更多讨论急切加载和其他很棒的 nHibernate 内容的帖子。

  • 确实是一篇好文章,但不确定我是否可以将其应用于我的情况。关于急切加载特定根实体的文章中描述的解决方案,我的问题是我想急切加载根实体的集合。如果我要使用 MultiCritera,我需要找到一种方法来连接所有不同的查询,而不指定特定的实体。建议如何做? (2认同)