好吧,我看到了一些类似的问题,但答案要么让我感到困惑,要么似乎完全被过度设计了,所以我想问自己的问题。
我有一个名为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