代码改变世界

DataTable 转 List<T>

2013-11-19 00:10  sql_manage  阅读(388)  评论(0编辑  收藏  举报

最近在做一个项目,表的数据巨多,而且表的字段一般都在30个以上。公司规定不能用Nhibernate以及ef等ORM框架。

所以查询绑定时的工作量极为痛苦。没有办法,自己写了个DataTableToList方法来简化一下,希望对大家有所帮助。

其实这个方法主要是用泛型方法来实现的,代码如下,仅供参考如有不妥,欢迎拍砖!

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) {
                GridView1.DataSource =result();
                GridView1.DataBind();
            }
        }
        private List<Student> result() {
            DataTable dt = new DataTable();
            DataColumn[] cols = new DataColumn[] { 
                 new DataColumn(){ ColumnName="name"},
                 new DataColumn(){ ColumnName="sex"},
                 new DataColumn(){ ColumnName="age"}
            };
            dt.Columns.AddRange(cols);
            List<object[]> rows = new List<object[]>  { 
               new object[] { "xiaochun","man","22"},
               new object[] { "xiaochun1", "man", "22" },
               new object[] { "xiaochun2", "man", "22" }
            };
            Array.ForEach(rows.ToArray(),row=>dt.Rows.Add(row));
            List<Student> stuList = new List<Student>();
            stuList = DataTableToList(new Student(),dt);
            return stuList;
        }

        private List<T> DataTableToList<T>(T obj,DataTable dt) {
            List<T> list = new List<T>();
            foreach (DataRow row in dt.Rows) { 
                  Type t=typeof(T);
                  PropertyInfo[] info = t.GetProperties();
                  foreach (DataColumn col in dt.Columns) {
                      info.Where(s => s.Name.ToLower() == col.ColumnName.ToLower())
                            .Select(s => s).First().SetValue(obj,row[col.ColumnName].ToString(),null);                  }
                  list.Add(obj);
            }
            return list;
        }
    }

    public class Student{
        public string name{get;set;}
        public string sex{get;set;}
        public string age{get;set;}
    }