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中的映射实体

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