如何转换一个DataTable到Asp.Net MVC一个POCO对象?(How do I conv

2019-07-04 02:10发布

如何转换一个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?