Entidad de mapeo en Dapper

.net c# dapper mapping orm

Pregunta

Acabo de empezar a trabajar con Dapper y no parece encontrar algo tan simple como asignar una entidad a una tabla en mi base de datos:

Tengo un procedimiento almacenado:

CREATE PROCEDURE [dbo].GetUserById (@UserId int)
AS  
begin               
        SELECT UserId,LastName,FirstName,EmailAddress
        FROM users
        WHERE UserID = @UserId

end
go

Entonces una entidad:

public class User
{
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
}

Y una consulta inteligente en mi código:

int userid=1;
    User User = connection.Query<User>("#GetUserById", new {userid=userid}, commandType: CommandType.StoredProcedure).FirstOrDefault();

Mi pregunta es: ¿cómo puedo decirle al usuario de mi entidad que ID es Userid en mi base de datos?

En EF, haría algo como esto:

MapSingleType(c => new
            {
                UserId = c.Id,
                Firstname = c.Firstname,
                Lastname = c.Lastname,
                EmailAddress = c.Email
            }).ToTable("users");

¿Cómo se puede lograr lo anterior en Dapper?

Respuesta aceptada

Dapper deliberadamente no tiene una capa de mapeo; es el mínimo absoluto que puede funcionar, y francamente cubre la mayoría de los escenarios reales en el proceso. Sin embargo, si entiendo correctamente que no desea alias en el TSQL, y no quiero ninguna propiedad de paso a través, entonces use la API de Query no genérica:

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();

o quizás más simplemente en el caso de un solo registro:

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
};

El truco aquí es que la API Query(...) no genérica Query(...) usa dynamic , ofreciendo miembros por nombre de columna.


Respuesta popular

No puede, su clase de usuario debe definirse para que coincida con el resultado de la consulta.

Una vez que hayas recuperado el resultado, debes asignarlo manualmente a otra clase (o usar AutoMapper)



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué