您的位置:首页 > 其它

一行code实现ADO.NET查询结果映射至实体对象。

2017-04-25 10:21 447 查看
AutoMapper是一个.NET的对象映射工具。

主要用途

领域对象与DTO之间的转换、数据库查询结果映射至实体对象。

这次我们说说 数据库查询结果映射至实体对象。

先贴一段代码:

public Student GetStudent(SqlDataReader reader)
{
string studentId = reader.GetString(0);
string studentIdSuffix = reader.GetString(1);
long studentId = reader.GetInt64(2);
string firstName = reader.GetString(3);
string middleName = string.Empty; // TODO: Restore middle name code - reader.GetString(4);
string lastName = reader.GetString(5);
string alternateFirstName = reader.IsDBNull(6) ? string.Empty : reader.GetString(7);
string alternateLastName =  reader.IsDBNull(8) ? string.Empty : reader.GetString(9);
}


这是项目中十年前的code,当然这里面的属性只是冰山一角,可想而知这耦合度多高,降低了后期的维护效率。

后来大家用反射实现了很多DataSet、SqlDataReader、DataTable与实体、集合之间的相互转换的helper类库,其便捷性也是可以接受的。

但是如果就用一行code是不是更便捷。

Demo:

Datatable->List

DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Age");
dt.Columns.Add("School");
for (int i = 0; i < 10; i++)
{
var newRow = dt.NewRow();
newRow["Name"] = "戴威" + i;
newRow["Age"] = 23 + i;
newRow["School"] = "清华大学";
dt.Rows.Add(newRow);
}

var studentlist = AutoMapper.Mapper.DynamicMap<List<Student>>(dt.CreateDataReader());

public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string School { get; set; }
}


DataSet->List

DataSet ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Age");
dt.Columns.Add("School");
for (int i = 0; i < 10; i++)
{
var newRow = dt.NewRow();
newRow["Name"] = "戴威" + i;
newRow["Age"] = 23 + i;
newRow["School"] = "清华大学";
dt.Rows.Add(newRow);
}
ds.Tables.Add(dt);
var studentlist = AutoMapper.Mapper.DynamicMap<List<Student>>(ds.CreateDataReader());


SqlDataReader->Entity

string conStr = "server=.;database=Test;Trusted_Connection=SSPI";
SqlConnection con = new SqlConnection(conStr);

SqlCommand command = new SqlCommand();
command.CommandText = string.Format("select * from {0}", "Test");
command.Connection = con;
SqlDataReader reader = null;

try
{
con.Open();
reader = command.ExecuteReader();

if (reader.Read())
test = AutoMapper.Mapper.DynamicMap<List<Test>>(reader);

}
catch (Exception ex)
{
//.....
}
finally
{
if (reader != null)
reader.Close();
}


public class Test
{
public string Id { get; set; }

public string Name { get; set; }

public string Age { get; set; }


}

仅仅做的是test,烦请不吝赐教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: