使用NHibernate.Linq按子类型过滤实体

时间:2009-08-06 01:06:16

标签: c# nhibernate linq-to-nhibernate

鉴于此继承映射:

<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

有关如何针对多个子类型表达查询的任何想法?

2 个答案:

答案 0 :(得分:1)

据我所知,这是不可能的。也许将来会是这样。我知道他们接受补丁: - )

我只有大约500条记录和4种类型,我通常会同时查询2种或3种类型。现在,我在数据库中的每个类型上应用过滤器,然后连接结果集并在内存中进行排序和分页。

这不是最有效的解决方案,但效果很好。我选择不向User表添加多余的鉴别器列,仅用于启用此查询。

答案 1 :(得分: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>() );
相关问题