在大部分时候我们从ADO中得到的数据都是DataTable、DataSet数据源,然而有强迫症的同学老是喜欢折腾,硬是要把它转换为实体集合,说是DataTable效率差云云,于是乎收到了同化。
1,数据实体
public class UserInfo { public int ID { get; set; } public string name { get; set; } }
2,数据源(想象成从库中得到的数据)
DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", typeof(int))); dt.Columns.Add(new DataColumn("name", typeof(string))); for (int i = 0; i < 10; i++) { DataRow dr = dt.NewRow(); dr["ID"] = i.ToString(); dr["name"] = "name" + i.ToString(); dt.Rows.Add(dr); }
转换的核心很简单,传入获取到的数据源与一个Func<DataRow, UserInfo>委托即可
public List<T> DtToList<T>(DataTable dt, Func<DataRow, T> fun) { List<T> list = new List<T>(); foreach (DataRow dr in dt.Rows) { list.Add(fun(dr)); } return list; }
在调用时只需要构建一个Func<DataRow, UserInfo>委托
Func<DataRow, UserInfo> fun = x => new UserInfo() { ID = Convert.ToInt32(x["ID"]), name = x["name"].ToString() };
调用
var list = DtToList<UserInfo>(dt, fun);
或许有人会说,你这样转换无非是吧原先底层的转换换了个位置嘛。
确实,只是换了个位置。但是,有很多同学在做ORM的转换时通过反射或者Emit去赋值?
试想下,如果我们为一些特定的类编写一个转换的委托,让后以上述形式去给实体赋值,这岂不快哉?