鉴于以下内容:
公司有一系列产品对象 区域有一组Product对象 任何特定产品都有公司和区域 SpecialProduct是Product的子类。
我在NHibernate中使用以下HQL查询。
// 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>();
当上面的第二个语句执行时,我收到一条错误说明:
无法执行查询[SQL:SQL不可用]
值“SpecialProduct”不是“MyNamespace.DomainModel.SpecialProduct”类型,不能在此通用集合中使用。
参数名称:值
(注意,由于SpecialProduct类中的ToString()覆盖,该对象在上面的消息中显示为“SpecialProduct”。)
如果我更改语句以返回超类的列表,Product,就像这样......
IList<Product> products = query.List<Product>();
...然后我没有收到错误,列表中返回了一个匹配的对象。在调试器中检查这个对象,我看到根据ToString()覆盖,实际上看起来似乎是一个SpecialProduct,但仔细观察我发现它是一个NHibernate代理类。如果我尝试将对象转换为SpecialProduct,则转换失败。嗯......
我还检查了数据库本身并确认该记录已保存为SpecialProduct(基于join-subclass表中存在匹配记录的事实)。
我需要将结果作为SpecialProperty对象的通用集合。
关于为什么这不起作用的任何想法?