25

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

一直在尝试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>();

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

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

有什么建议么?

4

3 回答 3

8

找到了解决方案,但它并不漂亮。首先我去查找所有发票 ID,然后在多查询中使用它们,最后通过 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>();
于 2009-06-04T23:00:33.023 回答
2

回答您的问题:是的,它会产生巨大的结果集。

我建议:

  • 只是天真地写你的查询而不急于获取
  • 在某些地方,放置一个急切的提取,但每个查询只有一个
  • 如果您确实遇到了无法通过索引或通过增强查询和映射策略解决的性能问题,请将您的解决方案与多个查询一起使用。
于 2009-10-21T08:57:37.183 回答
0

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

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

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

于 2009-06-02T08:39:19.337 回答