如何使用NHibernate查询具有嵌套属性的对象?

时间:2014-08-29 23:23:30

标签: c# nhibernate nhibernate-criteria nested-properties

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

我有一个名为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样本"。我认为使用以下代码非常容易:

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>();

但这是抛出:&#34; NHibernate.Exceptions.GenericADOException:无法执行查询&#34;。我尝试过使用Expression.Disjunction,我尝试过使用别名,限制和SimpleExpressions,我知道没有像未映射的属性或拼写错误的标准那样愚蠢。我见过的唯一可能有帮助的是ISession.QueryOver&lt;&gt;()函数,但我对lambda表达式感到非常困惑。有没有人为我提供只使用简单的CreateCriteria&lt;&gt;的解决方案如上所述的陈述?

提前致谢!

1 个答案:

答案 0 :(得分: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>();

另外,请检查: