1

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

我如何创建一个真正代表一个 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
       }
}

我上面提到的方法有多好?请分享想法/替代品

谢谢

4

1 回答 1

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;
   }
}

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

于 2013-08-08T11:30:06.807 回答