3

我正在研究一个实验性的 TreeView,其中每个 TreeViewItem 可以表示一个条件,也可以表示一个带有运算符的分支。这将被解析为 SQL。

例如,树可能有一个带有“AND”或“OR”运算符的分支,其子节点将成为条件。这被用来作为能够生成WHERE一个 SQL 语句的段,例如((Name = 'Matt' AND AGE > 20) OR (Name = 'John' AND Age = 15)) AND Job = 'Student'

我该怎么做呢?到目前为止,我所做的是将一string,list<Condition>对放在 a 中Tuple<>,其中字符串表示分支运算符 (AND/OR),列表表示该分支中包含的条件。

但是,由于每个分支都可以拆分为多个运算符分支或条件,因此它很快就会变得极其复杂

4

2 回答 2

2

您可以使用递归函数treeview从顶部解析,因此树视图的每个根注释都是一个 SQL 语句:

例如:

在此处输入图像描述

功能代码:  

string getHead(TreeViewItem t)
            {
                string s = "";
                if (t.Items.Count == 0) //get the condition
                {
                    return s=t.Header.ToString(); //change this to your real getCondition function.
                }
                else
                {
                    for (int i = 0; i < t.Items.Count; i++ )
                    {
                        if(t.Items[i] is TreeViewItem) //Edit: only use treeviewitems not the button...
                        {
                          if (i == 0) // first note doesn't need the operator 
                          {
                            s += getHead(t.Items[0] as TreeViewItem);
                          }
                          else // only needs operator in between
                          {
                             s += (string.IsNullOrEmpty(getHead(t.Items[i] as TreeViewItem).Trim()) ? "" : (" " + t.Header + " " + getHead(t.Items[i] as TreeViewItem))); // only get real treeviewitem, not the one with two buttons and an empty header; change t.Header to your real getOperator function.

                          }
                        }                    
                    }
                    return string.Format("({0})",s); //group sub conditions
                }
            }

用法:

MessageBox.Show(getHead((treeView1.Items[0] as TreeViewItem)));

结果:

在此处输入图像描述

于 2012-12-17T13:49:45.227 回答
0

在您的树形视图中,最后一个 AND 和 OR 不应该互换吗?我无法使用该视图获得您在下面指定的相同解析字符串。

AND
    AND
         Job='Student'
         Age > 20
    AND
         OR
            Name='John'
            Name='Matt'
         Sex='Male'   

最后一个 AND 与另一个 OR 条件和单个语句。

不确定这是否有帮助,但野牛会生成 C 代码以进行自下而上的解析。你可以试一试。

e: conditional statement|
   e AND e|
   e OR e
;
于 2012-12-17T09:50:48.303 回答