Dapper中的映射实体
本文关键字:实体 映射 Dapper | 更新日期: 2023-09-27 18:26:31
我刚开始使用Dapper,似乎没有发现像将实体映射到数据库中的表这样简单的东西:
我有一个存储过程:
CREATE PROCEDURE [dbo].GetUserById (@UserId int)
AS
begin
SELECT UserId,LastName,FirstName,EmailAddress
FROM users
WHERE UserID = @UserId
end
go
然后是一个实体:
public class User
{
public int Id { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Email { get; set; }
}
我的代码中有一个dapper查询:
int userid=1;
User User = connection.Query<User>("#GetUserById", new {userid=userid}, commandType: CommandType.StoredProcedure).FirstOrDefault();
我的问题是:如何告诉我的实体User Id是我数据库中的Userid?
在EF中,我会做这样的事情:
MapSingleType(c => new
{
UserId = c.Id,
Firstname = c.Firstname,
Lastname = c.Lastname,
EmailAddress = c.Email
}).ToTable("users");
如何在dapper中实现上述目标?
Dapper故意没有映射层;它是可以工作的绝对最低限度,坦率地说,它涵盖了该过程中的大多数真实场景。但是,如果我正确理解您不想在TSQL中使用别名,也不想使用任何pass-thru属性,那么请使用非通用Query
API:
User user = connection.Query("...", ...).Select(obj => new User {
Id = (int) obj.UserId,
FirstName = (string) obj.FirstName,
LastName = (string) obj.LastName,
Email = (string) obj.EmailAddress
}).FirstOrDefault();
或者更简单地说,在单个记录的情况下:
var obj = connection.Query("...", ...).FirstOrDefault();
User user = new User {
Id = (int) obj.UserId,
FirstName = (string) obj.FirstName,
LastName = (string) obj.LastName,
Email = (string) obj.EmailAddress
};
这里的技巧是非通用Query(...)
API使用dynamic
,为每个列名提供成员。
不能,必须定义用户类以匹配查询返回的结果。
返回结果后,必须手动将其映射到另一个类(或使用AutoMapper)
你可以试试这样的东西:
public class User
{
public int Id { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Email { get; set; }
#region Remappings
public int UserId
{
get { return Id; }
set { Id = value; }
}
#endregion
}
对于您的示例来说,这可能有些过头了,但我发现它在某些情况下很有用,可以避免混淆每个Query<>使用重新映射代码调用。
我向您推荐NReco。它的性能与dapper类似,但具有简单的属性映射。nreco