NHibernate懒惰=“额外”

时间:2011-02-22 15:15:30

标签: nhibernate

关于究竟懒惰=“额外”能够做什么,是否有一个很好的解释?

我看到的所有帖子都重复了这样一个事实:它将对MyObject.ItsCollection.Count的引用转换为select count(*)查询(假设它们尚未加载)。

我想知道它是否能够提供更强大的功能,例如将MyObject.ItsCollection.Any(o => o.Whatever == 5)转换为SELECT ...EXISTS查询。

docs的第18.1节仅触及它。我不是NH开发人员,因此我无法真正尝试它并观看SQL事件探查器而不需要做一些工作来设置所有内容;我只是想找一些描述这个功能的参考资料。

谢谢!

3 个答案:

答案 0 :(得分:20)

对于版本2.x它仅用于将collection.Count()翻译为select count,据我所知,在源代码中,它还允许构造collection[5]获取该特定实体(索引为5)而不是保护整个集合。

对于版本3.x,我没有在发行说明中看到任何相关内容

答案 1 :(得分:5)

尝试使用lazy =“extra”

映射的集合Customer.Orders上调用Any()
customer.Orders.Any()

,生成的SQL语句看起来像这样(简化):

SELECT *
FROM Order
WHERE CustomerId = 120

而在致电时

customer.Orders.Count > 0

生成的SQL看起来像这样:

SELECT count(*)
FROM Order
WHERE CustomerId = 120

答案 2 :(得分:4)

lazy = extra允许计算集合的元素而无需获取它,因为惰性实体用代理装饰,当客户端代码要求集合上的.Count时,正确“ select count“向数据库发出查询。如果没有lazy=extra,则从数据库中读取集合。