NHibernate Linq查询Where(x => x是基类)不能获得派生对象

时间:2017-02-02 14:14:19

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

让我们说我有以下结构,用鉴别器映射(每个层次结构的表):

    Entity (abstract, no discriminator)
      |
    Animal (abstract, no discriminator)
    /    \
Dog (1)  Cat(2)

如果我使用Linq对NHibernate进行查询:

.Where(x => x.Entity is Animal)

我没有结果。查看生成的查询时,我希望看到:

where type in (1, 2)

但我得到了这个:

where type='animal'

动物是抽象的,甚至没有鉴别器,因此生成的查询毫无意义。

深入挖掘我发现查询在内部被翻译成类似于HQL中的WHERE x.class=animal。这是Linq到NHibernate的一个错误吗?或者是预期的行为?

2 个答案:

答案 0 :(得分:1)

解决了这个错误将此功能添加到NHibernate。更改为here,可以从源代码构建。我发出了一个拉取请求,希望很快就会有效。

更新:它是merged,应该可以在下一个版本中使用。

答案 1 :(得分:0)

使用时会得到预期的结果吗?

session.Query<Animal>().Select(a => a.yourXEntity).ToList()

session.Query<Animal>().SelectMany(a => a.yourXEntityCollection).ToList()

代替?那些人应该处理多态性。

虽然你的lambda x.Entity is Animal很可能被转换为HQL x.Entity.class = Animal,它不处理多态,只接受指定类的鉴别器值,默认为其类名。