2013-08-08 2 views
1

У меня есть хранимая процедура, которая возвращает столбцы с поворотными столбцами вместе с столбцами из таблиц. Я получаю DataTable после выполнения хранимой процедуры. Теперь я хочу преобразовать этот DataTable в список < 'MyClass'>. В DataTable есть несколько известных столбцов (из таблиц) и некоторое неизвестное количество столбцов в результате поворота.Создание бизнес-класса для DataRow с неизвестным числом столбцов

Как создать класс, который действительно представляет один DataRow. Идея у меня следующая:

public class TableColumns 
{ 
     public int TableColumn1 { get;set; } 
     public string TableColumn2 { get;set; } 
     public float TableColumn1 { get;set; } 
     //additional columns if any 
} 

public class PivotColumns 
{ 
     public string ColumnName { get;set; } 
     public string Value { get;set; } 
     //additional columns if any 
} 

public class MyClass 
{ 
     public TableColumns tableColumns { get;set; } 
     public List<PivotColumns> pivotedColumns { get;set; } 

     //overload the [] operator with real implementation 
     public string this[string pivotedColumnName] { get;set; } 
} 

, а затем вспомогательный класс для выполнения преобразования:

public static class ConversionHelper 
{ 
     public static MyClass ConvertDataRowToMyClass(DataRow dataRow) 
     { 
       // some implementation 
     } 

     public static DataRow ConvertMyClassToDataRow(MyClass myClass) 
     { 
       // some implementation 
     } 
} 

Насколько хорошо подход я упоминал выше? Пожалуйста, разделяющие идеи/чередуется

Благодарности

ответ

1

Я сделал бы ниже себя.

public class TableColumns 
{ 
    public int TableColumn1 { get;set; } 
    public string TableColumn2 { get;set; } 
    public float TableColumn3 { get;set; } 
    //additional columns if any 
} 

public class PivotColumns 
{ 
    public string PivotColumn1 { get;set; } 
    public int PivotColumn2 { get;set; } 
    public float PivotColumn3 { get;set; }  
    //additional columns if any 
} 

public class MyClass : TableColumns, PivotColumns{ } 




public static class ConversionHelper 
{ 
    public static List<MyClass> ConvertDataRowToMyClass(DataTable dt) 
    { 
      // some implementation 
      List<MyClass> ltMyClass = (from dr in dataTable.AsEnumerable() 
             select new MyClass 
             { 
              TableColumn1 = dr["TableColumn1"] == DBNull.Value || dr["TableColumn1"] == null ? default(int) : dr.Field<int>("TableColumn1"), 
              PivotColumn2 = dr.Field<int>("PivotColumn2"), 
              TableColumn2 = dr.Field<string>("TableColumn2") 
             }).ToList<MyClass>(); 
    } 

    public static DataTable ConvertMyClassToDataRow(List<MyClass> lstMyClass) 
    { 
      // some implementation 
      PropertyDescriptorCollection properties = 
      TypeDescriptor.GetProperties(typeof(MyClass)); 
      DataTable table = new DataTable(); 
      foreach (PropertyDescriptor prop in properties) 
       table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
      foreach (T item in data) 
      { 
       DataRow row = table.NewRow(); 
       foreach (PropertyDescriptor prop in properties) 
         row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
       table.Rows.Add(row); 
      } 
      return table; 
    } 
} 

Я скопировал список к логике преобразования DataTable из here.

+0

Идея наследования MyClass из TableColumns и PivotColumns хороша. Спасибо за реализацию преобразования. Но меня больше интересует настройка MyClass, чем преобразование между DataRow и MyClass. – hammadmirza

Смежные вопросы