5

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

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

或者

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

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

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

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

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

4

3 回答 3

4

看看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);
}
于 2012-09-23T20:52:54.667 回答
0

我找到了这个解决方案

计算存储在字符串中的算术表达式 (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# 表达式]

于 2014-03-10T14:55:25.003 回答
0

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

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

如果数据库真的很慢(这种情况很常见),那么编写一个 SQL Builder 类来处理硬编码的字符串可能会很有用。

如果您不使用这两种方法,那么不幸的是,您真正希望的最好结果是运行时异常(由于显而易见的原因,这并不是最佳的)。

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

于 2012-09-23T21:01:13.873 回答