Ayende在他关于NHibernate Mapping – Inheritance的帖子中概述了各种 NHibernate 继承策略是如何工作的。他对 union-subclass 的解释显示生成的 SQL 是使用联合各种表的子查询。然后从中选择该子查询。
我不明白为什么在引用以这种方式映射的对象时,子查询不受引用的 id 的限制。我很担心,因为这似乎非常低效。随着公司和人员表中记录数量的增加,从每个表中选择所有内容将需要很长时间。简单地通过 Party 对象的 id 限制子查询将至少从每个表中获取特定记录,而不是所有记录,然后再进行限制。
为了更好地说明这一点,生成的 SQL 大约是:
select this_.Id as Id2_0_,
this_.FirstName as FirstName3_0_,
this_.CompanyName as CompanyN1_4_0_,
this_.clazz_ as clazz_0_
from (select Id,
FirstName,
null as CompanyName,
1 as clazz_
from People
union all
select Id,
null as FirstName,
CompanyName,
2 as clazz_
from Companies) this_
where Id = 123
引用特定方时,为什么生成的 SQL 不是
select this_.Id as Id2_0_,
this_.FirstName as FirstName3_0_,
this_.CompanyName as CompanyN1_4_0_,
this_.clazz_ as clazz_0_
from (select Id,
FirstName,
null as CompanyName,
1 as clazz_
from People
where Id = 123
union all
select Id,
null as FirstName,
CompanyName,
2 as clazz_
from Companies
where Id = 123) this_
第二个似乎更有效,并且假设适当的索引不会受到不断增长的公司和人员表的损害。这个问题是由对我的问题的进一步研究引发的:如何映射一个 UnionSubclass 所以从中生成的查询是有限的。