2009-08-06 46 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