注意:在所有示例中,如果类A,B和C不是特定类的占位符。我正在谈论的查询是在运行时动态生成的,我的代码并不总是知道具体类型。以下示例中的所有文字值都是我实际用例中的变量。
我有一个类的层次结构A -> B -> C
。它们通过多对一关系联系在一起。还有另一个表P
,但它没有通过关系链接。
我在A
上生成条件查询,并希望在in
上的属性上添加子查询(C
)。
我想要做的查询的简化示例如下。
var recordsCriteria = session.CreateCriteria(baseType.FullName, "base");
var subCriteria = NC.Subqueries.PropertyIn("B.C.Id",
NC.DetachedCriteria.For<P>()
.SetProjection(NC.Projections.Property<P>(x => x.EntityId))
.Add(NC.Restrictions.Eq(NC.Projections.Property<P>(x => x.PermissionId), 1)))
));
recordsCriteria.Add(subCriteria);
这不起作用,因为NHibernate似乎只能处理一个级别的关系(也就是说,如果我做B.Id
而不是它有效,但我需要任意深度)。
我可以从https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs#L669看到这似乎是&#34;意图&#34;行为(虽然这种限制似乎没有记录在任何地方?我当然错过了至少阅读Criteria API的信息)
我可以使用Criteria API以另一种方式进行此查询吗?