2009-08-06 36 views
2

亞型考慮到這種繼承映射:過濾實體與NHibernate.Linq

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="User" table="[User]" abstract="true"> 
     <joined-subclass name="SubUser1" table="SubUser1"> 
      <key column="UserId" /> 
      ... 
     </joined-subclass> 
     <joined-subclass name="SubUser2" table="SubUser2"> 
      <key column="UserId" /> 
      ... 
     </joined-subclass> 
     <joined-subclass name="SubUser3" table="SubUser3"> 
      <key column="UserId" /> 
      ... 
     </joined-subclass> 
    </class> 
</hibernate-mapping> 

我怎麼查詢的SubUser2SubUser3所有實例?我知道我能做到這一點:

session.Linq<User>().OfType<SubUser2>() 

但只允許我用一個單一的類型進行篩選。我嘗試這樣做:

session.Linq<User>().Where(user => user is SubUser2) 

但導致這個錯誤:

could not resolve property: of: User 

如何表達對多個子類型查詢任何想法?

+0

我有同樣的問題。你知道如何在標準中做到這一點?在標準中可能的情況下,必須能夠使「is」操作員工作。 – Paco 2009-08-06 19:36:28

回答

1

據我所知,這是不可能的。也許它會在未來。我知道他們接受補丁:-)

我只有約500個記錄和4種類型,我通常在同一時間查詢2或3種類型。現在,我在數據庫中的每種類型上應用過濾器,然後連接結果集並在內存中進行排序和分頁。

這不是最有效的解決方案,但工作得很好。爲了啓用此查詢,我選擇不在用戶表中添加多餘的鑑別器列。

0

什麼是這樣的:

// Get them in 2 queries 
var sub2 = session.Linq<SubUser2>().Select(x => x).ToList(); 
var sub3 = session.Linq<SubUser3>().Select(x => x).ToList(); 

// Join together in memory 
var sub2And3 = sub2.OfType<User>().Union(sub3.OfType<User>()); 
+1

不幸的是,這並不能讓我表達對數據庫的查詢。我會在內存中應用過濾,排序和分頁。 – 2009-08-30 06:34:56

+0

也許可以在數據庫上應用Union(儘管不知道它是否受支持)。 – 2009-08-30 10:08:32

+0

我在閱讀你的答案時試過了,聯盟不支持。 – 2009-08-30 17:21:44