2012-09-23 77 views
5

Tôi có một kịch bản trong đó tôi đang lưu các điều kiện "if" của tôi trong cơ sở dữ liệu dưới dạng chuỗi. Ví dụ:Đánh giá biểu thức có điều kiện

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

HOẶC

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

Bây giờ, tôi muốn đánh giá rằng người dùng có đầu vào điều kiện cú pháp đúng. Đây là ví dụ về cú pháp không chính xác:

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

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

Giống như chúng tôi đã đánh giá biểu thức truy vấn. Có thể là biểu hiện tress có thể hữu ích. Nhưng bằng cách nào? Cần giúp đỡ về vấn đề này.

+1

Có thể dễ dàng phát triển hoặc sử dụng trình tạo biểu thức hơn, sau đó bạn không phải lo lắng về biểu thức duff trừ khi có điều gì đó sai với mã của bạn. –

Trả lời

3

Hãy xem NCalc. Đó là một khuôn khổ để đánh giá các biểu thức toán học.

Khi biểu thức có lỗi cú pháp, việc đánh giá sẽ ném một Đánh giá ngoại lệ.

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

Mặc dù, bạn cũng có thể phát hiện lỗi cú pháp trước khi đánh giá bằng phương pháp HasErrors().

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

Visual studio không thực sự biết những gì các chuỗi đại diện cho kiến ​​thức của tôi không có phân tích cú pháp được thực hiện trong chính chuỗi đó.

Thông thường khi lập trình với C# và sử dụng sql, bạn sẽ cố gắng thực hiện càng nhiều tính toán càng tốt trong chính C# (nếu có thể chọn toàn bộ bảng, sau đó xử lý kết quả bằng C#).

Nếu cơ sở dữ liệu thực sự chậm, điều này có thể hữu ích khi viết lớp SQL Builder để xử lý các chuỗi được mã hóa cứng.

Nếu bạn không sử dụng những phương pháp này, thật không may là tốt nhất bạn thực sự có thể hy vọng là ngoại lệ thời gian chạy (không phải là tối ưu vì lý do hiển nhiên).

EDIT: Có vẻ như SelectQueryBuilder library đã tồn tại đối với kịch bản thứ hai mà tôi đề xuất.

+0

Kính gửi tất cả, Tôi điều đó bằng cách sử dụng Microsoft Roslyn CTP tôi có thể đạt được nó. Tôi thích điều đó và tôi đang nghiên cứu nó. Hy vọng tìm giải pháp phù hợp. Cảm ơn mọi lúc. – Mehdi

0

tôi tìm thấy giải pháp này

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

[Lưu ý: Giao diện này bị phản đối. Nhưng nó đánh giá bất kỳ biểu thức số học và biểu thức C#]

Các vấn đề liên quan