我的数据库结构如下:
TABLE1
- IdTable2
TABLE2
- IdTable3
TABLE3
TABLE4
- IdTable3
DAO类如下:
public class Class1
{
public virtual Class2 Class2 {get; set;}
}
以此类推...
我想使用C#中的NHibernete标准来连接这4个表。
以这种方式加入前三个表非常容易:
ICriteria criteria = this.SessionNHManager.CreateCriteria<Expedition>("T1");
criteria.CreateAlias<Class1>(i => i.Class2, "T2", JoinType.LeftOuterJoin);
criteria.CreateAlias<Class2>("T2", t => t.Class3, "T3", JoinType.LeftOuterJoin);
不幸的是,我无法以相同的方式加入第四张表,因为FK在Table3端而不在Table4端。
我认为也可以使用DetachedCriteria来完成,例如:
DetachedCriteria subquery = DetachedCriteria.For<Class4>("T4");
subquery.Add(Expression.EqPropertyL<Class3, Class4>("T3", h => h.Id, "T4", af => af.Class3.Id));
subquery.SetProjection(Projections.ProjectionList() .Add(Projections.Property<Class4>("T4", af => af.Id))
);
criteria.Add(Subqueries.PropertyIn("Class2.Class3", subquery));
显然,当查询尝试执行时,最后一行是不允许的(编译是可以的)。我收到以下运行时错误:
could not resolve property: Class2.Class3 of: .Class1
Class1.Class2.Class3属性导航对我来说看起来很正常,尽管我看着DAO类(所有东西都声明为公共虚拟)。
我想Subqueries.PropertyIn无法处理2级导航。
您看到我写错了什么吗?还有其他方法可以执行此联接吗?