FluentNhibernate - 使用ReferencesAny进行查询

时间:2014-01-03 22:27:38

标签: nhibernate fluent-nhibernate linq-to-nhibernate

使用ReferencesAny<>时有.EntityTypeColumn(“MyType”),它对应用程序不可见。 是否有选项可以使用HQL或其他内容查询该列以及如何集成到我的LINQ to HQL查询中?

2 个答案:

答案 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)

如何简单地映射您引用的实体中的列。例如,有各种类型的基类吗?