覆盖延迟加载行为'lazy = false'

时间:2015-05-11 11:50:56

标签: nhibernate criteria queryover

我想覆盖在映射中设置为'lazy = false'的默认延迟加载行为。无法更改它,因为现有应用程序的许多部分都依赖于此设置。

花了几个小时后,我找不到解决方案,所以我在这里问。 怎么做?
我想要实现的是微调我的查询以仅加载所需的内容 这是我已经尝试过的:

使用var properties = session.QueryOver<Property>() .Fetch(prop => prop.Transactions).Eager .Fetch(prop => prop.Districts).Eager //I dont want to load those entities below so I mark //them as lazy - IT DOESN'T WORK //I can see in SQL that they are getting loaded in separate queries .Fetch(prop => prop.Districts.First().Aliases).Lazy .Fetch(prop => prop.Districts.First().PolygonPoints).Lazy .Skip(i * pageSize) .Take(pageSize) .List(); api:

Criteria

使用var criteria = session.CreateCriteria<Property>(); criteria.SetFetchMode("Transactions", NHibernate.FetchMode.Join); criteria.SetFetchMode("Districts", NHibernate.FetchMode.Join); criteria.SetFetchMode("Districts.Aliases", NHibernate.FetchMode.Select); // tried Lazy too criteria.SetFetchMode("Districts.PolygonPoints", NHibernate.FetchMode.Select); // tried Lazy too criteria.AddOrder(NHibernate.Criterion.Order.Asc("Id")); criteria.SetFirstResult(i * pageSize); criteria.SetMaxResults(pageSize); var properties = criteria.List<Property>(); api:

List<>()

使用上述任何方法时,在调用{{1}}时始终会加载“别名”和“PolygonPoints”。在我的过程中我不需要它们。

我正在使用Nhibernate 4.0 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在这种情况下,我们无法覆盖映射。我们可以采用相反的方式 - 懒惰到位 - 并使用急切的查询来进行查询。

决策过程(of reference loading)在查询之外完成,事后。所以它可以预加载,但无法避免。

此处的解决方案可能有两种类型。

如果(正确地)使用投影列表,即使是参考文献,也有非常清楚的例子:

我们还需要自定义结果转换器,它将事后创建返回数据的所有引用: