表达式在c#中评估

时间:2017-02-20 16:41:12

标签: c# mysql dll expression

我有这样的表名表达式表 id表达式

1   a+b
2   SQRT(a)*c
3   a/b+3
4   a*a

另一个名为dataentry的表,如

time a b c 
9.15 2 5 0
9.30 1 0 7

所以现在我想从表达式表中计算表达式,并从dataentry表中计算表达式的变量,还要注意我有一些特殊的函数存储在一个dll中,我也可以使用它。

如果有人建议在mysql存储过程中对此进行评估,但我的限制是在dll中引用的一些特殊函数,所以只需要在c#中进行评估。

1 个答案:

答案 0 :(得分:0)

您当然可以从中创建System.Linq.Expressions,但由于您指定的格式不一定是“本机”表达式格式,并且您提到您在外部库中引用了方法,因此更容易使用Roslyn并动态生成/运行该代码(有关详细信息,请参阅http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis.CSharp/Compilation/CSharpCompilation.cs或搜索其中的SO)。这种方法的优点是你可以使用大部分表达式,而无需转换它们。

using static System.Math;
var a = 2; // taken from db dataentry table
var c = 7; // taken from db dataentry table

// statement taken from db expression table
// Sqrt(a)*c
var result = Sqrt(a)*c;

这里的好处是,你的表达式不受C#语言的约束(即使编译它们的主代码是C#)。

如果您仍想创建LINQ表达式,可以通过创建如下表达式来实现:

using static System.Math;
var a = 2; // taken from db dataentry table
var c = 7; // taken from db dataentry table

// statement taken from db expression table
// Sqrt(a)*c
Expression<Func<double, double, double>> expression = (a, c) => Sqrt(a)*c;
var result = expression.Compile().Invoke(a, c);

注意:后者仅在您使用更简单的语句时才有效;而对于前者,您可以使用分支等来评估更复杂的逻辑。

如果这不是您真正想知道的,请您重新提出问题并提供更多详情?