如何转换一个DataTable到Asp.Net MVC一个POCO对象?
Answer 1:
通过每个进的DataRow类的构造(或使用getter / setter方法),并且每个列翻译成相应的属性。 小心空列正确提取它们。
public class POCO
{
public int ID { get; set; }
public string Name { get; set; }
public DateTime? Modified { get; set; }
...
public POCO() { }
public POCO( DataRow row )
{
this.ID = (int)row["id"];
this.Name = (string)row["name"];
if (!(row["modified"] is DBNull))
{
this.Modified = (DateTime)row["modified"];
}
...
}
}
Answer 2:
数据表通常拥有许多行 - 你想每一行转换成一个对象实例?
在这种情况下,你可以如一个构造函数添加到您的POCO对象,将接受一个DataRow
的参数,然后提取从点点滴滴DataRow
:
public YourPOCO(DataRow row)
{
this.Field1 = row["Field1"].ToString();
...
this.FieldN = Convert.ToInt32(row["FieldN"]);
}
等等,然后调用每个在该行的这个构造DataTable.Rows
集合:
List<YourPOCO> list = new List<YourPOCO>();
foreach(DataRow row in YourDataTable.Rows)
{
list.Add(new YourPOCO(row));
}
而你可以再创建基于此“YourPOCO”类型ASP.NET MVC视图或局部视图,并使用“目录”模板创建一个列表一样的显示“YourPOCO”实例的列表。
渣
Answer 3:
老问题了,反正这可能是有用的人:
private static T CreatePocoObject<T>(DataRow dr) where T : class, new()
{
try
{
T oClass = new T();
Type tClass = typeof (T);
MemberInfo[] methods = tClass.GetMethods();
ArrayList aMethods = new ArrayList();
object[] aoParam = new object[1];
//Get simple SET methods
foreach (MethodInfo method in methods)
{
if (method.DeclaringType == tClass && method.Name.StartsWith("set_"))
aMethods.Add(method);
}
//Invoke each set method with mapped value
for (int i = 0; i < aMethods.Count; i++)
{
try
{
MethodInfo mInvoke = (MethodInfo)aMethods[i];
//Remove "set_" from method name
string sColumn = mInvoke.Name.Remove(0, 4);
//If row contains value for method...
if (dr.Table.Columns.Contains(sColumn))
{
//Get the parameter (always one for a set property)
ParameterInfo[] api = mInvoke.GetParameters();
ParameterInfo pi = api[0];
//Convert value to parameter type
aoParam[0] = Convert.ChangeType(dr[sColumn], pi.ParameterType);
//Invoke the method
mInvoke.Invoke(oClass, aoParam);
}
}
catch
{
System.Diagnostics.Debug.Assert(false, "SetValuesToObject failed to set a value to an object");
}
}
return oClass;
}
catch
{
System.Diagnostics.Debug.Assert(false, "SetValuesToObject failed to create an object");
}
return null;
}
来源http://blog.developers.ie/cgreen/archive/2007/09/14/using-reflection-to-copy-a-datarow-to-a-class.aspx
Answer 4:
我看到了有关数据访问层使用的DataTable您的其他问题。 如果你在某个时候返回POCO它是一个好主意,让你的DAL返回POCO了。
你可以使用一个SqlDataReader对象来填充POCO。 这是重量越来越轻。 有时它更容易使用DataSet和DataTable条目的名单,但如果你变换分析行分为stronly类型POCOS反正我很舒尔,这是要走的路。
文章来源: How do I convert a datatable into a POCO object in Asp.Net MVC?