2009-02-06 166 views
3

我有一個數據集與DataRelations(經典順序頭/細節對)鏈接在一起的一些DataTables。是否有一種簡單的方法將整個批量歸一化爲一個DataTable,並將相關表的所有列歸一化?非規範化數據集

表名和列在編譯時未知,並且可能有兩個以上的表/關係。

回答

2

我的自我也有同樣的問題,但由於這個問題沒有答案,我不得不寫自己的denormalizer。原來並不是那麼困難 - 所以這是您(或其他遇到此問題的其他人)可能能夠使用/擴展的第一次切割:

public class DataSetDenormalizer 
{ 
    public void DenormalizeRelationships(DataSet dataSet) 
    { 
     IOrderedEnumerable<DataRelation> orderedRelationship = SortRelationshipsByNumberOfChildRows(dataSet); 
     var tablesToRemove = new List<DataTable>(); 

     foreach (DataRelation relationship in orderedRelationship) 
     { 
      DenormalizeColumns(relationship); 
      DenormalizeData(relationship); 
      RemoveDenormalizedRelationships(dataSet, relationship, tablesToRemove); 
     } 
    } 

    private IOrderedEnumerable<DataRelation> SortRelationshipsByNumberOfChildRows(DataSet dataSet) 
    { 
     var relationships = new List<DataRelation>(); 
     foreach (DataRelation relationship in dataSet.Relations) 
      relationships.Add(relationship); 
     return relationships.OrderBy(r => r.ChildTable.Rows.Count); 
    } 

    private void DenormalizeColumns(DataRelation relationship) 
    { 
     for (int columnIndex = 0; columnIndex < relationship.ParentTable.Columns.Count; ++columnIndex) 
     { 
      DataColumn column = relationship.ParentTable.Columns[columnIndex]; 
      if (relationship.ParentColumns.Contains(column)) continue; 
      relationship.ChildTable.Columns.Add(new DataColumn(column.ColumnName, column.DataType)); 
     } 
    } 

    private void DenormalizeData(DataRelation relationship) 
    { 
     for (int rowIndex = 0; rowIndex < relationship.ChildTable.Rows.Count; ++rowIndex) 
     { 
      DataRow row = relationship.ChildTable.Rows[rowIndex]; 
      DataRow parentRow = row.GetParentRow(relationship); 

      for (int columnIndex = 0; columnIndex < relationship.ParentTable.Columns.Count; ++columnIndex) 
      { 
       DataColumn column = relationship.ParentTable.Columns[columnIndex]; 
       if (relationship.ChildTable.Columns.Contains(column.ColumnName)) 
       { 
        row.SetField(column.ColumnName, parentRow[column]); 
       } 
      } 
     } 
    } 

    private void RemoveDenormalizedRelationships(DataSet dataSet, DataRelation relationship, List<DataTable> tablesToRemove) 
    { 
     dataSet.Relations.Remove(relationship); 
     relationship.ChildTable.Constraints.Remove(relationship.RelationName); 

     if (!tablesToRemove.Contains(relationship.ParentTable)) 
      tablesToRemove.Add(relationship.ParentTable); 

     int numberOfColumns = relationship.ChildColumns.Length; 
     for (int columnIndex = 0; columnIndex < numberOfColumns; ++columnIndex) 
     { 
      relationship.ChildTable.Columns.Remove(relationship.ChildColumns[columnIndex]); 
     } 
    } 
} 
0

我不認爲數據集本身支持這個,但在代碼中很容易做到。

首先,您應該創建一個空數據表,然後從兩個要組合的表中添加所需的所有列。

然後,您逐步瀏覽主表中的數據,並逐步查看相關表中的所有相關行。對於相關表中的每一行,您都可以在新表中創建一個新行,並將這兩個數據行中的數據插入到新行中。

我現在無法訪問visual studio,但您明白了。