如何查询 NHibernate 的特定类型?

Posted

技术标签:

【中文标题】如何查询 NHibernate 的特定类型?【英文标题】:How to query NHibernate for specific type? 【发布时间】:2011-02-25 16:02:19 【问题描述】:

我正在使用 Fluent NHibernate 和 DiscriminateSubClassesOnColumn() 来支持子类化。用于区分子类的列未映射到实体上的实际属性。

如何创建只返回给定类型实体的查询?

这是我的尝试,其中 propertyName 是我的区分列的名称,value 是类型名称:

return _db.CreateCriteria<T>()
            .Add(Restrictions.Eq(propertyName, value))
            .List<T>();

但是,这给了我错误“无法解析属性:类型:[我的实体类型]”,这是因为实体本身没有该属性。如果我将该属性添加到我的实体并对其进行映射,我会收到另一个错误:“System.IndexOutOfRangeException : Invalid index 7 for this SqlParameterCollection with Count=7.”

【问题讨论】:

【参考方案1】:

您将类型传递给泛型参数 T。例如,如果 Cat 和 Dog 扩展抽象类 Animal:

return _db.CreateCriteria<Cat>()
        .List<Cat>();

返回所有猫

    return _db.CreateCriteria<Animal>()
        .List<Animal>();

返回猫和狗。

【讨论】:

【参考方案2】:

您应该只根据您感兴趣的子类创建一个条件。例如,如果您的实体层次结构包含从 EntityA 派生的 EntityB,而您只希望 EntityB 这样做:

session.CreateCriteria<EntityB>().List();

您将获得实体 B 类型的所有实体。没有理由显式处理鉴别器。

【讨论】:

以上是关于如何查询 NHibernate 的特定类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NHibernate QueryOver 重新创建这个复杂的 SQL 查询?

通过代码进行 Nhibernate 一对一映射

在 NHibernate 中动态更改查询类型

使用 NHibernate 从头开始​​:新的大型应用程序的提示

NHibernate 数字类型进行模糊查询

通过子类结构在 nHibernate 表上使用 Linq 按类型查询