gpt4 book ai didi

nhibernate - 急切地使用 NHibernate 加载子集合

转载 作者:行者123 更新时间:2023-12-03 11:02:34 26 4
gpt4 key购买 nike

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

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

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

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

有什么建议?

最佳答案

找到了一个解决方案,但它并不漂亮。首先,我找到所有发票 ID,然后在多查询中使用它们,最后通过 HashedSet 过滤结果。由于项目数量众多,有时我无法使用正常的 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 加载子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com