2012-09-23 175 views
5

我有一個場景,我將數據庫中的「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 '(' 

就像我們在評估查詢表達式一樣。表達式可能會有幫助。但是如何?在這方面需要幫助。

+1

可能更容易開發或使用表達式生成器,那麼除非代碼出現問題,否則不必擔心duff表達式。 –

回答

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

Visual Studio中並不真正知道什麼字符串代表就我所知,所以沒有字符串本身內進行解析。

通常在使用C#編程和使用sql時,您會嘗試儘可能多地在C#中進行計算(如果可行,請選擇整個表格,然後使用C#處理結果)。

如果數據庫真的很慢,這很常見,編寫一個SQL Builder類來處理硬編碼的字符串可能很有用。

如果您不使用這些方法,那麼不幸的是,您真正希望的最好方法是運行時異常(由於顯而易見的原因,這不是最佳的)。

編輯: 看起來SelectQueryBuilder library已經存在爲我建議的第二個場景。

+0

親愛的所有人, 我說,通過使用微軟Roslyn CTP我可以實現它。我喜歡這一點,我正在努力。希望找到合適的解決方案。 謝謝所有的時間。 – Mehdi

0

我發現這個解決方案

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

SOLUTION:

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#表達式]