2012-09-23 13 views
5

Ho uno scenario in cui sto salvando le mie condizioni "se" nel database come una stringa. Per esempio:Valuta espressione condizionale

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

O

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

Ora, voglio valutare che l'utente ha immesso la condizione sintatticamente corretta. Questi sono esempi di sintassi errata:

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

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

Come in Espressione di query. Potrebbe essere la treccia di espressione può essere utile. Ma come? Hai bisogno di aiuto in questo senso.

+1

Potrebbe essere più facile sviluppare o utilizzare un generatore di espressioni, quindi non devi preoccuparti delle espressioni duff a meno che non ci sia qualcosa di sbagliato nel tuo codice. –

risposta

3

Dai uno sguardo allo NCalc. È un framework per valutare espressioni matematiche.

Quando l'espressione ha un errore di sintassi, la valutazione genererà una valutazioneExpression.

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

però, si può anche rilevare errori di sintassi prima della valutazione utilizzando il metodo HasErrors().

0

Lo studio di visualizzazione non sa veramente cosa rappresentano le stringhe, quindi, per quanto ne so, non c'è parsing fatto all'interno degli stessi archi.

In genere quando si programma con C# e si utilizza sql, si tenta di eseguire il maggior numero possibile di calcoli in C# stesso (se è possibile selezionare l'intera tabella quindi gestire il risultato utilizzando C#).

Se il database è molto lento, come spesso accade, potrebbe essere utile scrivere una classe SQL Builder per gestire le stringhe codificate.

Se non si utilizza nessuno di questi metodi, sfortunatamente il meglio che si possa davvero sperare è l'eccezione di runtime (che non è ottimale per ovvi motivi).

MODIFICA: Sembra che esista già uno SelectQueryBuilder library per il secondo scenario suggerito.

+0

Gentile cliente, L'utilizzo di Microsoft Roslyn CTP mi consente di ottenerlo. Mi piace e ci sto lavorando. Spero di trovare una soluzione adeguata. Grazie per tutto il tempo. – Mehdi

0

ho trovato questa soluzione

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

SOLUZIONE:

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: Questa interfaccia è deprecato. Ma valuta tutte le espressioni aritmetiche e le espressioni C#]

Problemi correlati