我正在尝试与自定义HQL生成器一起使用LINQ表达式,并且在查找构建相应HQL的文档时遇到了一些麻烦。
我已经设法解决了如何将任意LINQ表达式注入HQL。这可行,但实现强制NHibernate水合对象并在内存中执行操作。实际上,这个(或简单的“sqlmethod”调用)很容易找到实例。
当我知道确切的课程时,我可以通过“QueryOver”获得我需要的地方:
var query = session.QueryOver<Trip>(() => trip)
.JoinAlias(() => trip.AccessControl, () => ace, JoinType.InnerJoin)
.Where(() => ace.EntityName == entityName);
我正在努力的是如何使用“IN”或“JOIN”条款来做到这一点。
public override HqlTreeNode BuildHql(
MethodInfo method,
Expression targetObject,
ReadOnlyCollection<Expression> arguments,
HqlTreeBuilder treeBuilder,
IHqlExpressionVisitor visitor)
{
// This entity has a 'AccessControl' property
// containing an access control list
var securable = visitor.Visit(targetObject).AsExpression();
// This is my problem: How do I build the previous QueryOver in here?
return treeBuilder.Join(/* HqlExpression */null, /* HqlAlias */null);
}
我在视觉上围绕着NHibernate GitHub仓库,包括测试,但找不到任何能够解决问题的东西。谷歌也出现了nada。