我有一个场景,我将数据库中的“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 '('
就像我们在评估查询表达式中一样。可能是表达发辫可能会有所帮助。但是怎么样?在这方面需要帮助。
答案 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#表达式