在Dapper中映射实体

.net c# dapper mapping orm

我刚刚开始使用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)



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow