Я уже реализовывал такой подход, но помню, что он работал в моем конкретном случае.
Я предполагаю, что Car - это базовая таблица с некоторыми общими столбцами, если это так, то вы можете отобразить свои сущности следующим образом (я использую Fluent NHibernate
):
CarMap:
public class CarMap : ClassMap<Car> { ... }
ConcreteCarMap:
public class ConcreteCarMap : SubclassMap<ConcreteCar>
{
public ConcreteCarMap()
{
Extends<CarMap>();
// other properties
// Map(x => x.Property).Not.Nullable();
}
}
Имея это, вы можете выполнить свой запрос:
from item in session.Query<Car>() select item;
И действительно, вам нужно будет типизировать возвращаемые объекты в их типы подклассов, чтобы получить доступ к свойствам и методам подкласса, но NHibernate будет достаточно intelligent
, чтобы создать их правильно для вас.
NHibernate достигнет этого, используя такой синтаксис (псевдо sql):
select
-- all columns from Car
-- all columns from ConcreteCar
-- other columns from subclasses
case
when f1.SubId is not null then 1
when f2.SubId is not null then 2
when f3.SubId is not null then 3
when f4.SubId is not null then 4
when f5.SubId is not null then 5
when f0.Id is not null then 0
end as type
from Car f0
left outer join ConcreteCar f1 on f0.Id = f1.SubId
-- other joins
Таким образом, в зависимости от фактического количества реализованных подклассов это может повлиять на производительность.
Надеюсь, это ответит на ваш вопрос.