在Linq.Expressions.Expression中使用Math.Abs​​ - 动态查询创建

时间:2018-01-24 10:57:27

标签: c# linq expression

我正在使用Expression以编程方式创建动态查询。

Expression.Subtract(exp1, exp2);

在一个要求中,我需要使用表达式的绝对值。像 -

这样的东西
Math.Abs(Expression.Subtract(exp1, exp2));

但我收到的错误 -

  

System.Math.Abs​​(decimal)'的最佳重载方法匹配   一些无效的论点

2 个答案:

答案 0 :(得分:3)

您不想在表达式上致电Math.Abs()。您希望使用Math.Abs()表达式的结果创建表示Subtract的调用的表达式。

所以首先你需要找到Math.Abs()的正确重载,一个采用你的减法表达式返回的类型的参数:

var sub = Expression.Subtract(exp1, exp2);
MethodInfo abs = typeof(Math).GetMethod("Abs", new[]{sub.Type});
if (abs == null)
    // error handling here: no matching method found

sub.Type是减法表达式的返回类型。

然后你可以创建一个调用表达式:

var call = Expression.Call(null, abs, sub);

答案 1 :(得分:2)

您想在Math.Abs上致电x - y,而不是Expression。由于类型Abs中的方法Mathstatic,您不需要实例来调用它,这就是CallExpression的第一个参数为空的原因。

这样做:

var subtractExp = Expression.Subtract(exp1, exp2);
var m = typeof(Math).GetMethod("Abs", new[] { subtractExp.Type });
var exp = Expression.Call(null, m, subtractExp);