2013-02-20 88 views
1

我试图实现一个C#模块,将动态帧的SQL语句,即时通讯思想涉及到树数据结构的战略,该值应该被存储在一个树状结构如何在C#中使用树框架动态SQL语句?

enter image description here

我有设计类如下面实施树

class T 
{ 
    string tableName=""; 
    C[] column{get;set} 
} 

class C 
{ 
    string className=""; 
    V[] value{get;set;} 
} 

class V 
{ 
    string fieldVal=""; 
} 

我需要实现这将消耗类T和生成SQL如下方法

insert into T1(C1,C2,C3) values(V1,V1,V1); 
insert into T1(C1,C2,C3) values(V2,V1,V1); 
insert into T1(C1,C2,C3) values(V3,V1,V1); 

这似乎很简单,但我在实施该方法时感到震惊,因为我没有树的经验。我想我必须使用BFS和DFS的组合,但我不知道如何继续。 请让我知道如何做到这一点,代码示例将是伟大的!

在此先感谢!

回答

1

有你需要解决两个问题:

  1. 如何树状结构转换成所有可能值集合的集合。
  2. 如何将设置的值转换为sql表达式。

的第一个问题可能最容易通过递归迭代列,并收集值的集合上前一起到列表:

// convert tree into collection of value sets 
public IEnumerable<List<string>> ExplodeValueSets(T tree, int cIndex = 0) { 
    // recursive portion as long as there are more columns to process 
    if (cIndex < tree.column.Length) { 
     // recursive generate list for rest of columns 
     var subResult = ExplodeValueSets(tree, cIndex + 1); 

     // combine values in this column with recursively-generated 
     // sets from rest of columns to build up larger sets 
     foreach (var result in subResult) 
      foreach (var value in tree.column[cIndex].value) 
       yield return new List<string> { value.fieldVal }.Concat(result).ToList(); 
    } else { 
     // base condition - all columns are processed, so return empty list 
     yield return new List<string>(); 
    } 
} 

这将原有的树状结构转换成你的图片到列表的集合:

  • V1,V1,V1
  • V2,V1,V1

从这里,这是一个简单的事情,这些数值组转换成SQL语句:

public string GenerateSQL(T tree) { 
    var valueSets = ExplodeValueSets(tree); 
    var sql = new StringBuilder(); 
    foreach (var set in valueSets) 
     sql.AppendLine(GenerateSingleSQLInsert(tree, set)); 
    var finalSql = sql.ToString(); 
    return finalSql; 
} 

public string GenerateSingleSQLInsert(T tree, List<string> values) { 
    var sqlFormat = "insert into [{0}]([{1}]) values('{2}');"; 
    var table = tree.tableName; 
    var columnList = string.Join("],[", tree.column.Select (c => c.className).ToArray()); 
    var valueList = string.Join("','", values.ToArray()); 
    var sql = string.Format(sqlFormat, table, columnList, valueList); 
    return sql; 
} 

把它一起使用的样品树(我做的所有属性和类别中使用公开在为了这个工作正确):

T tree = new T { 
    tableName = "T1", 
    column = new C[] { 
     new C { className = "C1", value = new V[] { new V { fieldVal = "V1" }, new V { fieldVal = "V2" } } }, 
     new C { className = "C2", value = new V[] { new V { fieldVal = "V1" } } }, 
     new C { className = "C3", value = new V[] { new V { fieldVal = "V1" } } } 
    } 
}; 

var sql = GenerateSQL(tree); 
Console.WriteLine(sql); 

输出:

insert into [T1]([C1],[C2],[C3]) values('V1','V1','V1'); 
insert into [T1]([C1],[C2],[C3]) values('V2','V1','V1'); 
+0

嗨伴侣,这正是我需要的,分裂的过程中两个母鹿他们做出了巨大的改变。让我试着将这个逻辑集成到我的应用程序中并更新问题:)感谢您的帮助 – Umamaheswaran 2013-02-22 14:15:39