Учитывая следующее:
Компания имеет коллекцию объектов Product.
Область имеет коллекцию объектов Product.
Любой данный продукт имеет компанию и район.
SpecialProduct является подклассом продукта.
Я использую следующий запрос HQL в NHibernate.
// return all SpecialProperty objects for a given company and area.
IQuery query = session.CreateQuery("select product from Company as company " +
"join company.Products as product " +
"join product.Area as area " +
"where company.Id = :coId " +
"and area.Id = :arId " +
"and product.class = MyNamespace.DomainModel.SpecialProduct ")
.SetInt64("coId", companyId)
.SetInt64("arId", areaId);
IList<SpecialProduct> specialProducts = query.List<SpecialProduct>();
Когда 2-й оператор выше выполняет, я получаю сообщение об ошибке:
Не удалось выполнить запрос [SQL: SQL недоступен]
Значение «SpecialProduct» не относится к типу «MyNamespace.DomainModel.SpecialProduct» и не может использоваться в этой универсальной коллекции.
Имя параметра: значение
(Обратите внимание, что объект отображается в сообщении выше как «SpecialProduct» из-за переопределения ToString () в классе SpecialProduct.)
Если я изменю инструкцию, чтобы вернуть список суперкласса, Product, вот так ...
IList<Product> products = query.List<Product>();
... тогда я не получаю ошибку, и в списке возвращается один соответствующий объект. Изучая этот объект в отладчике, я вижу, что это, на самом деле, SpecialProduct в соответствии с переопределением ToString (), но при ближайшем рассмотрении я вижу, что это прокси-класс NHibernate. Если я пытаюсь привести объект к SpecialProduct, произойдет сбой приведения. Хммм ...
Я также зарегистрировался в самой базе данных и подтвердил, что запись была сохранена как SpecialProduct (исходя из того факта, что в таблице объединенных подклассов есть соответствующая запись).
Мне нужно получить результаты в виде общей коллекции объектов SpecialProperty.
Есть идеи, почему это не работает?