评估条件表达式

时间:2012-09-23 20:45:20

标签: c#

我有一个场景,我将数据库中的“if”条件保存为字符串。例如:

String condition = "(([age] >= 28) && ([nationality] == 'US'))";

OR

String condition = "([age] >= 28)";

现在,我想评估用户输入条件语法是否正确。这些是不正确语法的示例:

String condition = "(([age] >= 28) && ([nationality] == 'US')"; //Missed ')' bracket

String condition = "[age] >= 28)"; //Missed Opening bracket '('

就像我们在评估查询表达式中一样。可能是表达发辫可能会有所帮助。但是怎么样?在这方面需要帮助。

3 个答案:

答案 0 :(得分:3)

看看NCalc。它是评估数学表达式的框架。

当表达式出现语法错误时,评估将抛出EvaluationException。

try
{
    new Expression("(3 + 2").Evaluate();
}
catch(EvaluationException e)
{
    Console.WriteLine("Error catched: " + e.Message);
}

但是,您还可以使用HasErrors()方法在评估之前检测语法错误。

Expression e = new Expression("a + b * (");
if(e.HasErrors())
{
    Console.WriteLine(e.Error);
}

答案 1 :(得分:0)

Visual Studio并不真正知道字符串代表什么,所以据我所知,字符串本身没有解析。

通常在使用C#进行编程并使用sql时,您会尝试在C#中尽可能多地进行计算(如果可行则选择整个表,然后使用C#处理结果)。

如果数据库非常慢,这种情况经常发生,编写SQL Builder类来处理硬编码字符串可能很有用。

如果您不使用这些方法,遗憾的是,您真正希望的最好的是运行时异常(由于显而易见的原因,这不是最佳的)。

编辑: 对于我建议的第二种情况,似乎已经存在SelectQueryBuilder library

答案 2 :(得分:0)

我找到了这个解决方案

evaluate an arithmetic expression stored in a string (C#)

解决方案:

string conditiontext = "(([age] >= 28) && ([nationality] == \"US\"))";
conditiontext = conditiontext.Replace("[age]", 32)
                             .Replace("[nationality]","US");

/*VsaEngine*/
var engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();

/** Result will be either true or false based on evaluation string*/
var result = Microsoft.JScript.Eval.JScriptEvaluate(conditiontext, engine);

[注意:此接口已弃用。但它会评估任何算术表达式和c#表达式