使用 NHibernate;是否可以在子类级别执行限制时查询父类(super class)?
例如(伪代码的应用程序):
Class A
Property Prop1
End Class
Class B
Inherits Class A
Property Prop2
End Class
Class C
Inherits Class A
Property Prop3
End Class
我将如何执行如下查询:
from A where Prop1 = 'foo' AND
((if A is B) then B.Prop2 = 'bar' OR
(if A is C) then C.Prop3 = 'bar')
使用 Nhibernate.Linq 可以实现类似的功能吗? hql 或标准 API 怎么样?
最佳答案
由于 HQL 和 ICriteria 是域查询工具,我发现很难期望有这样的功能。
据我所知,唯一接近的事情是使用 ICriteria 的 Expression.Sql(),您可以在其中查询父类(super class),但使用纯 sql 注入(inject)子类特定片段。在那里,表达式会像
crit.Add(
Expression.Sql(@"(({alias}.DiscrimCol = :subClassADiscrimVal AND {alias}.Col2 = :barVal)
OR ({alias}.DiscrimCol = :subClassBDiscrimVal AND {alias}.Col3 = :barVal))",
new object[] { "subA", "subB", "bar" },
new IType[] { NHibernateUtil.String,NHibernateUtil.String,NHibernateUtil.String } )
);
不太好,但可以用
另一种方法是使用 ISQLQuery
,它至少允许 SELECT 部分是特定于域的(并使用 .AddEntity()
),这样您仍然可以选择您的托管父类(super class)和 WHERE 部分包含子类特定片段
========更新==========
再考虑一下,有一种方法可以通过 HQL 或 ICriteria 来实现这一点,但它更多的是一种解决方法,并且性能较差,因为它涉及子查询。 ICriteria 中的示例:
nhSes.CreateCriteria(typeof(Super))
.Add(
Restrictions.Disjunction()
.Add(Subqueries.PropertyIn("Id", DetachedCriteria.For(typeof(ChildA))
.SetProjection(Projections.Id())
.Add(Restrictions.Eq("ChildAProp", barVal))))
.Add(Subqueries.PropertyIn("Id", DetachedCriteria.For(typeof(ChildB))
.SetProjection(Projections.Id())
.Add(Restrictions.Eq("ChildBProp", barVal))))
)
我正在查询每个子项,投影其 id,然后选择父类(super class),从投影的子 id 中使用 IN 限制 id。
关于NHibernate - 如何在返回父类(super class)时查询子类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358488/