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());
}