一行code实现ADO.NET查询结果映射至实体对象。
AutoMapper是一个.NET的对象映射工具。
主要用途
领域对象与DTO之间的转换、数据库查询结果映射至实体对象。
这次我们说说 数据库查询结果映射至实体对象。
先贴一段代码:
1 public Student GetStudent(SqlDataReader reader) 2 { 3 string studentId = reader.GetString(0); 4 string studentIdSuffix = reader.GetString(1); 5 long studentId = reader.GetInt64(2); 6 string firstName = reader.GetString(3); 7 string middleName = string.Empty; // TODO: Restore middle name code - reader.GetString(4); 8 string lastName = reader.GetString(5); 9 string alternateFirstName = reader.IsDBNull(6) ? string.Empty : reader.GetString(7); 10 string alternateLastName = reader.IsDBNull(8) ? string.Empty : reader.GetString(9); 11 }
这是项目中十年前的code,当然这里面的属性只是冰山一角,可想而知这耦合度多高,降低了后期的维护效率。
后来大家用反射实现了很多DataSet、SqlDataReader、DataTable与实体、集合之间的相互转换的helper类库,其便捷性也是可以接受的。
但是如果就用一行code是不是更便捷。
Demo:
Datatable->List
1 DataTable dt = new DataTable(); 2 dt.Columns.Add("Name"); 3 dt.Columns.Add("Age"); 4 dt.Columns.Add("School"); 5 for (int i = 0; i < 10; i++) 6 { 7 var newRow = dt.NewRow(); 8 newRow["Name"] = "戴威" + i; 9 newRow["Age"] = 23 + i; 10 newRow["School"] = "清华大学"; 11 dt.Rows.Add(newRow); 12 } 13 14 var studentlist = AutoMapper.Mapper.DynamicMap<List<Student>>(dt.CreateDataReader()); 15 16 17 public class Student 18 { 19 public string Name { get; set; } 20 public int Age { get; set; } 21 public string School { get; set; } 22 }
DataSet->List
1 DataSet ds = new DataSet(); 2 DataTable dt = new DataTable(); 3 dt.Columns.Add("Name"); 4 dt.Columns.Add("Age"); 5 dt.Columns.Add("School"); 6 for (int i = 0; i < 10; i++) 7 { 8 var newRow = dt.NewRow(); 9 newRow["Name"] = "戴威" + i; 10 newRow["Age"] = 23 + i; 11 newRow["School"] = "清华大学"; 12 dt.Rows.Add(newRow); 13 } 14 ds.Tables.Add(dt); 15 var studentlist = AutoMapper.Mapper.DynamicMap<List<Student>>(ds.CreateDataReader());
SqlDataReader->Entity
1 string conStr = "server=.;database=Test;Trusted_Connection=SSPI"; 2 SqlConnection con = new SqlConnection(conStr); 3 4 SqlCommand command = new SqlCommand(); 5 command.CommandText = string.Format("select * from {0}", "Test"); 6 command.Connection = con; 7 SqlDataReader reader = null;
8 try 9 { 10 con.Open(); 11 reader = command.ExecuteReader(); 12 14 if (reader.Read()) 15 test = AutoMapper.Mapper.DynamicMap<List<Test>>(reader); 16 17 } 18 catch (Exception ex) 19 { 20 //..... 21 } 22 finally 23 { 24 if (reader != null) 25 reader.Close(); 27 }
1 public class Test 2 { 3 public string Id { get; set; } 4 5 public string Name { get; set; } 6 7 public string Age { get; set; }
}
仅仅做的是test,烦请不吝赐教。
海的呐喊