一行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,烦请不吝赐教。

 

 

posted @ 2017-04-25 10:21  ~扎克伯格  阅读(954)  评论(0编辑  收藏  举报