使用ReferencesAny<>时有.EntityTypeColumn(“MyType”),它对应用程序不可见。 是否有选项可以使用HQL或其他内容查询该列以及如何集成到我的LINQ to HQL查询中?
答案 0 :(得分:1)
与往常一样,NHibernate为(几乎)所有内容提供了解决方案。
我们假设这样的映射(ala documentation):
ReferencesAny(x => x.AnyEntity) // the property name is AnyEntity... used below
// some explicit mapping
.AddMetaValue<Household>(typeof(Employee).Name)
.AddMetaValue<Client>(typeof(Contact).Name)
// the essence of <any>
.EntityTypeColumn("MyType")
.EntityIdentifierColumn("TheId")
.IdentityType<int>();
来自doc:14.7. The where clause:
的引用同样,特殊属性
class
在多态持久性的情况下访问实例的鉴别器值。嵌入在where子句中的.Net类名将被转换为其鉴别器值。
所以,现在我们告诉NHibernate,colunn MyType
包含type
,等同于C#type
。因为我们可以通过 .class 访问 EntityTypeColumn - 此查询会为我们提供我们想要的内容:
// the 'Contact' represents the value contained in DB...
var hql = "from MyEntity where AnyEntity.class = 'Contact' ";
...
session.CreateQuery(hql)
.List<MyEntity>();
这将生成WHERE ... MyType ='Contact'
QueryOver中的相同内容:
var query = session.QueryOver<MyEntity>()
.Where(x => x.AnyEntity is Contact)
.List<MyEntity>();
注意:坏消息,内置LINQ提供程序,类似的查询失败。我猜这是一个错误。即这不起作用session.Query<MyEntity>().Where(x => x.AnyEntity is Contact)
,生成错误的WHERE子句
评论中提出的扩展
我们还可以按<any>
元素ID 'EntityIdentifierColumn'
语法看起来像这样(请参阅神奇的“。id”选择器“)
query
...
.Where(Restrictions.In("AnyEntity.id", new[] {1, 2, 3, 4, 5, 6, 7, 8}))
...
答案 1 :(得分:0)
如何简单地映射您引用的实体中的列。例如,有各种类型的基类吗?