2012-09-23 13 views
5

Tengo un escenario en el que estoy guardando mis condiciones "si" en la base de datos como una cadena. Por ejemplo:Evaluar expresión condicional

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

O

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

Ahora, quiero evaluar que el usuario tiene la condición de entrada sintácticamente correcta. Estos son ejemplos de sintaxis incorrecta:

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

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

Al igual que en Evaluar expresión de consulta. Puede ser Expression tress puede ser útil. ¿Pero cómo? Necesito ayuda en este sentido.

+1

Puede ser más fácil desarrollar o usar un generador de expresiones, entonces no tiene que preocuparse por las expresiones duff a menos que haya algún problema con su código. –

Respuesta

3

Eche un vistazo a NCalc. Es un marco para evaluar expresiones matemáticas.

Cuando la expresión tiene un error de sintaxis, la evaluación lanzará una EvaluationException.

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

Sin embargo, también se puede detectar errores de sintaxis antes de la evaluación utilizando el método HasErrors().

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

Visual Studio no sabe realmente lo que representan las cuerdas de modo que yo sepa, no hay ningún análisis hecho dentro de las propias cadenas.

Normalmente cuando se programa con C# y con sql, intenta hacer la mayor cantidad posible de cálculos en C# (si es factible, seleccione toda la tabla y luego trate el resultado usando C#).

Si la base de datos es muy lenta, lo cual es bastante frecuente, puede ser útil escribir una clase SQL Builder para tratar con las cadenas codificadas.

Si no utiliza ninguno de estos métodos, desafortunadamente lo mejor que puede esperar realmente son las excepciones de tiempo de ejecución (que no es óptimo por razones obvias).

EDITAR: Parece que SelectQueryBuilder library ya existe para el segundo escenario que sugerí.

+0

Estimados Todos, Creo que al usar Microsoft Roslyn CTP lo puedo lograr. Me gusta eso y estoy trabajando en eso. Espero encontrar la solución adecuada. Gracias a todos por el tiempo. – Mehdi

0

He encontrado esta solución

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

SOLUCIÓN:

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); 

[Nota: Esta interfaz está en desuso. Pero evalúa cualquier expresión aritmética y expresiones C#]

Cuestiones relacionadas