zoukankan      html  css  js  c++  java
  • 一行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,烦请不吝赐教。

     

     

  • 相关阅读:
    树链剖分(转载)
    随机数生成器
    错排公式的理解与推导(转载)
    容斥原理(转载)
    Luogu 3758 [TJOI2017]可乐(有向图邻接矩阵幂的意义 矩阵快速幂)
    vue input复选框checkbox默认样式纯css修改
    vue 页面切换的时候vuex记录之前的滚动条位置
    vue从入门到进阶
    es6 学习笔记
    vue 项目笔记
  • 原文地址:https://www.cnblogs.com/kejie/p/6760608.html
Copyright © 2011-2022 走看看