NHibernate计算列

时间:2011-04-07 18:25:37

标签: c# nhibernate linq-to-nhibernate

我有一个实体(“A”),我通过NHibernate持续存在。这个实体可能在数据库中有几个类型(“B”)的子节点,当我检索实体A时,我希望有一个属性来指示属于A的实体B的计数。我不想使用这里收集因为我不必为了计算它们而必须检索所有B实体。

Psuedo SQL做我想做的事情:

select a.*, count(b.*) from a left join b on b.aid = a.id

这可能与NHibernate一起,特别是LINQ提供程序吗?

3 个答案:

答案 0 :(得分:3)

如果您在集合lazy="extra"中指定,当您访问集合中的count属性时,nhibernate将只获取子项的计数而不是所有子项。

见这里(第2个标题): http://blog.idm.fr/2010/02/improving-performance-with-nhibernate.html

答案 1 :(得分:1)

您可以将nHibernate绑定到视图吗?

CREATE VIEW A_augmented
AS
SELECT A.*
       ,(SELECT COUNT(*) FROM B WHERE B.aid = a.id) AS ChildCount
FROM A

(我知道这个SQL相对天真,但它只是一种在有效的SQL中表达它的简单方法)

答案 2 :(得分:1)

您可以使用Formula将属性映射到SQL表达式。 Ayendes网站上有an example of the very problem。很高兴使用,但可能有副作用,你需要了解。计算列当然不是最新的。它是加载实体时的快照。

您还可以使用HQL通过简单的语法来获取大小:

select a, size(a.Children)
from a

当然这也会返回一个快照,但是你的业务逻辑意识到这一点,因此它不是副作用。