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



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

我有一个名为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,我试过用别名、限制和SimpleExpressions,我知道不会发生像未映射的属性或拼写错误的条件这样愚蠢的事情。我看到的唯一一个可能有用的东西是ISession.QueryOver<>()函数,但我对lambda表达式感到非常困惑。有人能为我提供一个只使用简单CreateCriteria<>的解决方案吗像上面这样的陈述?

提前感谢!

Criteria查询的一个优点是,我们必须显式定义关联链。也就是说,我们必须介绍JOIN:

  • 15.4.协会(引用:)

通过使用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>();

此外,请检查以下内容:

  • NHibernate-CreateCriteria与CreateAlias

相关内容

  • 没有找到相关文章

最新更新