在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("#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属性 – 那么请使用非genericsQuery 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