nhibernate - 使用 NHibernate 加载子集合

  显示原文与译文双语对照的内容

我想加载 root 实体并立即加载它的子集合和聚合成员。

一直试图使用 SetFetchMode FluentNHibernate,但正副本集合在一个孩子的因为我有一个深度 3水平。 DistinctRootEntityResultTransformer只删除 root 复制。


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>();

我可以使用多个查询或者类似于存档的内容?

而且,这种方法不会导致来自数据库的不必要的结果集?

任何建议?

谢谢,Kristoffer

时间: 原作者:

找到了一个解决方案,但它并不是很好。 首先我去查找所有发票 IDs,然后在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>();

原作者:

回答你的问题:是的,这会导致巨大的结果。

我建议:

  • 简单地编写你的查询而不需要立即获取
  • 在特定的位置上,放置一个临时的抓取,但每次查询只能有一个
  • 如果你真的得到了性能问题,你不能通过索引或者增强查询和映射策略来解决这些问题,那么你可以使用多个查询来使用你的解决方案。
原作者:

虽然它可能不是你想要的,但我建议你查看本文:

急切加载具有许多子集合( NHibernate 常见问题)的聚合

如果你看看剩下的站点,你会发现更多的帖子,讨论立即加载和其他伟大的NHibernate 东西。

原作者:
...