如何使用fluent nhibernate将集合计数映射到实体

如何使用fluent nhibernate将集合计数映射到实体,nhibernate,collections,fluent-nhibernate,Nhibernate,Collections,Fluent Nhibernate,对于员工和下属-我想在一个查询中为员工加载下属计数 public class Employee { public Name {get;set;} public int NumberOfSubordinates {get;set;} } 生成的SQL应该如下所示: select e.name, (select count(*) from subordinate s where s.employee_id = e.id) NumberOfSubordinates from empl

对于员工和下属-我想在一个查询中为员工加载下属计数

public class Employee
{
    public Name {get;set;}
    public int NumberOfSubordinates {get;set;}
}
生成的SQL应该如下所示:

select e.name, (select count(*) from subordinate s where s.employee_id = e.id) NumberOfSubordinates
from employee e 
group by e.name
order by NumberOfSubordinates desc

可以将此列映射为公式

Map(x => x.NumberOfSubordinates)
    .FormulaIs(@"select count(*) from subordinate where subordinate.employee_id = id");

另一种方法是将下属映射为反向包,并使用lazy=“extra”。在这种情况下,
下属。Count
将执行SQL
Count(*)
,但不是作为初始加载的一部分。这种方法在Fluent中可能还不可用

当它在Fluent中可用时,请让use知道。虽然这样做有效,但我认为这样做效率不高,因为您正在select子句中运行子查询。有没有办法在主查询中将子表与group by左键联接?我必须在公式周围添加()以使其对我起作用,感谢您将我指向右方向Xtra Lazy Load现在在Fluent中可用。。。不确定它是什么时候添加的,但遇到了这个问题,我想我会插手。只是SQL的一个观察,但这似乎是获取所需数据的一种不好的方法,子选择是否应该替换为从属表上的联接,然后它上的计数(*)将产生相同的值?通过执行上述操作,您似乎在迫使查询计划器采取低效的路线。与你的问题没有太大关系,但这是我目前正在寻找的。