背景:我需要为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
答案 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());
}