一、應用場景:
由於數據庫設計和對象設計並不是一對一的,有時候一張數據表可以拆出多個對象來表述該數據表信息,也有時候多個數據表的某些字段被提取出來對應一個業務對象,這時候自定義RowMapper就有了用武之地。
二、演示代碼:
創建一張數據表:User表
if exists (select 1
from sysobjects
where id = object_id('"User"')
and type = 'U')
drop table "User"
go
create table "User" (
Id int identity,
Name nvarchar(50) null,
Pwd nvarchar(50) null,
constraint PK_USER primary key (Id)
)
go
創建一個業務實體對象UserInfo:public class UserInfo
{
public int Id { set; get; }
public string T_UserName { set; get; }
public string T_Password { set; get; }
}
小提示:注意User表和UserInfo對象並非一 一對應哦現在我們創建一個自定義的 UserInfoMap
public class UserInfoMap : IRowMapper<UserInfo>
{
public UserInfo MapRow(IDataRecord row)
{
UserInfo u = new UserInfo() { Id = int.Parse(row.GetString(0)), T_UserName=row.GetString(1), T_Password=row.GetString(2) };
return u;
}
}
自定義數據映射工作已經做完,現在我們去看如何使用我們自定義的RowMapper,貼上核心代碼如下: /// <summary>
/// 獲取單個對象數據
/// </summary>
/// <param name="id">Id</param>
/// <returns></returns>
public UserInfo GetUserInfo(int id)
{
string cmdText = string.Format("select * from UserInfo where id={0}", id);
var accrssor = db.CreateSqlStringAccessor(cmdText, new UserInfoMap());
var customerData = accrssor.Execute();
return customerData.FirstOrDefault<UserInfo>();
}
/// <summary>
/// 獲取一個對象集合數據
/// </summary>
/// <returns></returns>
public List<UserInfo> GetUserList()
{
string cmdText = "select * from UserInfo";
var accrssor = db.CreateSqlStringAccessor<UserInfo>(cmdText, new UserInfoMap());//MapBuilder<UserInfo>.BuildAllProperties()
var data = accrssor.Execute();
return data.ToList<UserInfo>();
}
注意:紅色字體標記的既是應用了自定義RowMap地方
補充:或者放棄自定義RowMapper可以這樣寫
public UserInfo GetUserInfo(int id)
{
string cmdText = string.Format("select * from UserInfo where id={0}", id);
var accrssor = db.CreateSqlStringAccessor(cmdText,
MapBuilder<UserInfo>.MapAllProperties()
.Map(x => x.UserName).ToColumn("UserName")
.Map(x => x.Password).ToColumn("Password")
.Build()
);
var customerData = accrssor.Execute();
return customerData.FirstOrDefault<UserInfo>();
}
至此結束。歡迎拍磚.........