Айенде в своем посте на NHibernate Mapping - Inheritance описывает, как работают различные стратегии наследования NHibernate.Его объяснение union-subclass показывает, что 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, чтобы сгенерированные из него запросы были ограничены .