NHibernate - 如何在返回父类(super class)时查询子类属性?

标签 nhibernate linq-to-nhibernate

使用 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/

相关文章:

c# - NHibernate 字典 : Could not initialize a collection

nhibernate - 如何使用 Fluent NHibernate 指定多列索引

c# - NHibernate 和 C# : error using nested properties with Criteria

linq - 具有分离条件的 NHibernate Query<T>...

使用通用存储库的 NHibernate Linq Eager Loading

nhibernate - 急切加载递归关系

nhibernate - NHibernate-处理StaleObjectStateException以始终提交客户端更改-需要建议/推荐

c# - NHibernate 为 LINQ 包含查询使用了错误的列类型(varchar 到 nvarchar)

c# - 在 linq 查询中无需硬键入/强制转换即可将不可空表达式转换为可空表达式

c# - 如何组合两个表达式?