HQL表达式等效于数据类型

时间:2011-07-27 13:40:20

标签: nhibernate expression-trees linq-to-nhibernate

背景:我需要为linqtohiberante创建一个类似自定义的扩展方法来执行以下操作,

 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表达式的参数列表中。请参阅上面代码段中的“卡在这里”文字。知道我该怎么做。

提前致谢

Bumble

1 个答案:

答案 0 :(得分:3)

没试过,但我认为你必须调用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());
    }