【问题标题】:QueryOver fails with could not resolve property:QueryOver 失败,无法解析属性:
【发布时间】:2012-04-03 19:19:49
【问题描述】:

我正在使用 NHibernate 3.0 并且正在比较 Query 和 QueryOver

var p = _prepo.Query<Party>()
            .Where(c => c.Person.LastName == "Bobby")
            .FirstOrDefault();

以上工作,如果我查看对象图,我会得到 p.Person 的代理类。

var p = _prepo.QueryOver<Party>()
            .Where(c => c.Person.LastName == "Bobby")
            .FirstOrDefault();

这个失败并出现错误 ==> 无法解析属性:Person.LastName of:

为什么?

【问题讨论】:

  • 我猜你正在使用 NHibernate.Linq 扩展。我发现生成的 SQL 问题几乎完全相同(至少对于这种类型的问题(我称之为“一阶嵌套查询”))。 Note: 如果LastName 是主键/外键,那么QueryOver 就可以正常工作。

标签: nhibernate linq-to-nhibernate nhibernate-criteria


【解决方案1】:

我不熟悉 Linq 提供程序,但是在使用 QueryOver 时,您必须使用连接来执行这样的查询:

示例 1

IQueryOver<Cat,Kitten> catQuery =
session.QueryOver<Cat>()
    .JoinQueryOver(c => c.Kittens)
        .Where(k => k.Name == "Tiddles");

示例 2

Cat catAlias = null;
Kitten kittenAlias = null;

IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => catAlias.Age > 5)
        .And(() => kittenAlias.Name == "Tiddles");

【讨论】:

  • 我希望 QueryOver 像 Query 一样简单明了,但很高兴知道工作原理。
  • IQueryOver 方法不起作用。 NHibernate 不断给我一个“无法解析 KittenCat 的属性”
【解决方案2】:

在这种情况下,当您使用 Linq 时,它会起作用,因为过滤是在客户端上完成的,而不是在数据库中。所以它实际上是 Where that is running 的 IEnumerable 版本,它与 NHibernate 无关。

QueryOver 使用 Expression&lt;Func&lt;T,object&gt;&gt;,NHibernate 尝试将其转换为 SQL 但失败。由于我不知道的原因,您必须使用 JoinQueryOver 或 JoinAlias 明确加入。

这里有更多关于 QueryOver 的信息: http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2014-02-24
    相关资源
    最近更新 更多