如何查询 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 查询?