为具有未知列数的DataRow创建业务类

时间:2013-08-08 10:39:12

标签: c# class datatable datarow business-logic-layer

我有一个存储过程,它返回已旋转的列以及表中的列。我在执行存储过程后得到了DataTable。现在我想将此DataTable转换为List<'MyClass'>。 DataTable有一些已知的列(来自表)和一些未知数量的列作为pivot的结果。

如何创建一个真正代表一个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 个答案:

答案 0 :(得分: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;
   }
}

我已将列表从here复制到数据表转换逻辑。