[英]Mapping entity in Dapper
我刚刚开始使用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; }
}
我的代码中有一个精巧的查询:
int userid=1;
User User = connection.Query<User>("#GetUserById", new {userid=userid}, commandType: CommandType.StoredProcedure).FirstOrDefault();
我的问题是:如何告诉我的实体用户我的数据库中的Id是Userid?
在EF我会做这样的事情:
MapSingleType(c => new
{
UserId = c.Id,
Firstname = c.Firstname,
Lastname = c.Lastname,
EmailAddress = c.Email
}).ToTable("users");
如何在短小精悍的情况下实现上述目标?
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.