[英]NHibernate SetFetchMode doesn't work with nested criteria
Assuming I run the following code: 假设我运行以下代码:
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>();
}
}
Why does NHibernate do this? NHibernate为什么这样做? How can I change my query/criteria so that the property is fetched eagerly?
如何更改我的查询/条件以便急切地获取属性?
Thanks. 谢谢。
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. 如果您在关联上具有过滤器,则NH无法确保返回关联的所有实体以初始化关联集合。 you can issue a Select for the ids and then fetch the entities with associations eagerly
您可以为ID发出Select,然后热切地获取具有关联的实体
...
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>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.