0

好的,我已经看到了一些与此类似的问题,但答案要么让我感到困惑,要么似乎完全过度设计,所以我想问我自己的问题。

我有一个名为 Tree 的类,它有一个 Plot 类的对象属性,它有一个 Year 类的对象属性,它有一个 Series 类的对象属性,它有一个名为 Id 的字符串属性。这总结如下。

public class Tree {
    public virtual Plot Plot { get; set; }
    // other properties...
}

public class Plot {
    public virtual Year Year { get; set; }
    // other properties...
}

public class Year {
    public virtual Series Series { get; set; }
    // other properties...
}

public class Series {
    public virtual string Id { get; set; }
    // other properties...
}

这些类中的每一个都对应于数据库的表,属性对应于外键字段(例如,Trees 表有一个名为 PlotKey 的字段,它引用 Plots 表中的一条记录)。我要做的就是从数据库中加载所有树,其相应系列的 ID 为“Adrian_2012”或“IPED Sample”。我认为使用以下代码很容易做到这一点:

IList<Tree> trees = session.CreateCriteria<Tree>()
                           .Add(Expression.Or(
                               Expression.Eq("Plot.Year.Series.Id", "Adrian_2012")
                               Expression.Eq("Plot.Year.Series.Id", "IPED Sample")
                           ))
                           .List<Tree>();

但这是抛出:“NHibernate.Exceptions.GenericADOException:无法执行查询”。我尝试过使用 Expression.Disjunction,我尝试过使用 Aliases、Restrictions 和 SimpleExpressions,并且我知道不会发生像未映射的属性或拼写错误的标准这样的愚蠢行为。我见过的唯一可能有帮助的是 ISession.QueryOver<>() 函数,但我对 lambda 表达式感到非常困惑。有没有人可以为我提供一个解决方案,只使用上面这样的简单 CreateCriteria<> 语句?

提前致谢!

4

1 回答 1

2

查询的一个不好的方面Criteria是,我们必须明确定义关联链。即我们要引入JOIN:

您可以通过使用 导航关联轻松地指定对相关实体的约束CreateCriteria()

所以要有一个 JOIN 我们需要这样的语法

var trees = session
     .CreateCriteria<Tree>()
     .CreateCriteria("Plot", "p")
     .CreateCriteria("Year", "y")
     .CreateCriteria("Series", "s")
     .Add(Expression.Or(
         Expression.Eq("s.Id", "Adrian_2012")
         Expression.Eq("s.Id", "IPED Sample")
     ))
     .List<Tree>();

另外,请检查:

于 2014-08-30T04:42:35.737 回答