代码之家  ›  专栏  ›  技术社区  ›  Bryan Watts

使用nhibernate.linq按子类型筛选实体

  •  2
  • Bryan Watts  · 技术社区  · 15 年前

    给定此继承映射:

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

    如何查询 SubUser2 SubUser3 ?我意识到我可以做到:

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

    但这只允许我按单个类型进行过滤。我试过这个:

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

    但这导致了这个错误:

    could not resolve property:  of: User
    

    对于如何表达对多个子类型的查询有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Bryan Watts    15 年前

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

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

    这不是最有效的解决方案,但效果很好。我选择不向用户表中添加多余的鉴别器列,而只是为了启用这个查询。

        2
  •  0
  •   Dmytrii Nagirniak    15 年前

    像这样的东西怎么样:

    // 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>() );