NHibernate SetFetchMode不适用于嵌套条件

编程入门 行业动态 更新时间:2024-10-14 00:28:33
本文介绍了NHibernate SetFetchMode不适用于嵌套条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

假设我运行以下代码:

var placementCriteria = DetachedCriteria.For<ResidentialPlacementClientService>(); placementCriteria.Add(Restrictions.Le("StartDate", effectiveDate)); placementCriteria.Add(Restrictions.Ge("EndDate", effectiveDate)); placementCriteria.SetFetchMode("CaseClient.CaseFile", FetchMode.Eager); placementCriteria.SetFetchMode("CaseClient.Incomes", FetchMode.Eager); placementCriteria.SetFetchMode("CaseClient.ClientProfile", FetchMode.Eager); placementCriteria.SetFetchMode("CaseClient.ClientProfile.Person", FetchMode.Eager); placementCriteria.SetFetchMode("VendorService", FetchMode.Eager); placementCriteria.SetFetchMode("VendorService.Vendor", FetchMode.Eager); using (var session = OpenSession()) { using (var tx = session.BeginTransaction()) { residentialPlacements = placementCriteria.GetExecutableCriteria(session).List<ResidentialPlacementClientService>(); } }

我的收入"属性已正确填充.

The "Incomes" property on my is populated correctly.

现在,当我添加收入标准时,就不再急切地获取财产.

Now when I add criteria on incomes, the property is no longer being fetched eagerly.

var placementCriteria = DetachedCriteria.For<ResidentialPlacementClientService>(); placementCriteria.Add(Restrictions.Le("StartDate", effectiveDate)); placementCriteria.Add(Restrictions.Ge("EndDate", effectiveDate)); placementCriteria.SetFetchMode("CaseClient.CaseFile", FetchMode.Eager); placementCriteria.SetFetchMode("CaseClient.Incomes", FetchMode.Eager); placementCriteria.SetFetchMode("CaseClient.ClientProfile", FetchMode.Eager); placementCriteria.SetFetchMode("CaseClient.ClientProfile.Person", FetchMode.Eager); placementCriteria.SetFetchMode("VendorService", FetchMode.Eager); placementCriteria.SetFetchMode("VendorService.Vendor", FetchMode.Eager); var caseClientCriteria = placementCriteria.CreateCriteria("CaseClient", JoinType.InnerJoin); var incomesCriteria = caseClientCriteria.CreateCriteria("Incomes", JoinType.InnerJoin); incomesCriteria.Add(Restrictions.Le("StartDate", effectiveDate)); incomesCriteria.Add(Restrictions.Or(Restrictions.Ge("EndDate", effectiveDate), Restrictions.IsNull("EndDate"))); incomesCriteria.Add(Restrictions.Eq("IncomeType", incomeType)); using (var session = OpenSession()) { using (var tx = session.BeginTransaction()) { residentialPlacements = placementCriteria.GetExecutableCriteria(session).List<ResidentialPlacementClientService>(); } }

NHibernate为什么要这样做?如何更改我的查询/条件,以便热切地获取属性?

Why does NHibernate do this? How can I change my query/criteria so that the property is fetched eagerly?

谢谢.

推荐答案

如果在关联上具有过滤器,则NH无法确保返回关联的所有实体以初始化关联集合.您可以为ID发出选择",然后急切地获取具有关联的实体

if you have filters on an association then NH cant be sure that all entities of the association are returned to initialize the association collection. you can issue a Select for the ids and then fetch the entities with associations eagerly

... placementCriteria.SetProjection(Projections.Id()); residentialPlacements = session.CreateCriteria<ResidentialPlacementClientService>() .Add(Subqueries.In("Id", placementCriteria)) .SetFetchMode("CaseClient.CaseFile", FetchMode.Eager); .SetFetchMode("CaseClient.Incomes", FetchMode.Eager); .SetFetchMode("CaseClient.ClientProfile", FetchMode.Eager); .SetFetchMode("CaseClient.ClientProfile.Person", FetchMode.Eager); .SetFetchMode("VendorService", FetchMode.Eager); .SetFetchMode("VendorService.Vendor", FetchMode.Eager); .List<ResidentialPlacementClientService>();

更多推荐

NHibernate SetFetchMode不适用于嵌套条件

本文发布于:2023-10-26 17:40:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1530867.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:嵌套   不适用于   条件   NHibernate   SetFetchMode

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!