2010-07-28 65 views
2

使用NHibernate;在子類級別執行限制時,是否可以對超類進行查詢?NHibernate - 如何在返回超類時針對子類屬性進行查詢?

例如(appologies的僞代碼):

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呢?

回答

3

由於HQL和ICriteria是域查詢工具,我發現很難期望這樣的功能。

AFAIK唯一接近的事情是使用ICriteria的Expression.Sql()查詢超類但用純sql注入子類特定片段。在那裏,表情會是什麼樣

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()),這樣你就可以仍然選擇管理超和WHERE部分包含的子類特異性片段

========= UPDATE ==========

退一步講,有一種方法通過HQL或ICri實現這一點但它更多的是解決方法,性能較差,因爲它涉及子查詢。例如在的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)))) 
     ) 

我正在quering每個孩子,項目的ID,然後選擇超類,從投影子ID限制的ID在。

+0

謝謝你;不幸的是,除了使用本地sql之外,沒有更清晰的方法。我想知道進行工會運作是否會是更好的選擇? – DanP 2010-07-29 16:40:19

+0

chech更新 – Jaguar 2010-07-30 10:33:35