等价于数据类型的HQL表达式



Background:我需要为linqtohibernate创建一个自定义的扩展方法来完成以下操作,

 result.Where(p => p.MyIntColumn.IsLike('%100%') );

,这样将输出如下所示的自定义SQL。

select * from orders where  CONVERT(VARCHAR, MyIntColumn) LIKE '%100%'

我试图通过扩展BaseHqlGeneratorForMethod来构建自定义表达式,如下所示。

    public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
            {
                return treeBuilder.Like(treeBuilder.MethodCall("convert", 
new[] { "stuck here",  visitor.Visit(arguments[0]).AsExpression() }),
                                        visitor.Visit(arguments[1]).AsExpression());
            }

我需要能够将VARCHAR作为表达式注入到MethodCall表达式的参数列表中。请参阅上述代码片段中的文本"卡在这里"。知道怎么做吗。

Thanks in advance

没有尝试,但我认为你必须调用treeBuilder。Cast代替treeBuilder。MethodCall

public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, 
        HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) 
    {
        return treeBuilder.Like(
            treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(), typeof(string)),
            visitor.Visit(arguments[1]).AsExpression());
    }

最新更新