好的,我已经看到了一些类似的问题,但答案要么让我感到困惑,要么似乎完全过度设计,所以我想问自己的问题。
我有一个名为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;的解决方案如上所述的陈述?
提前致谢!
答案 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>();
另外,请检查: