我有这样的表名表达式表 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#中进行评估。
答案 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);
注意:后者仅在您使用更简单的语句时才有效;而对于前者,您可以使用分支等来评估更复杂的逻辑。
如果这不是您真正想知道的,请您重新提出问题并提供更多详情?