我有一个存储过程,它返回已旋转的列以及表中的列。我在执行存储过程后得到了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
}
}
我上面提到的方法有多好?请分享想法/替代
由于
答案 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复制到数据表转换逻辑。