2012-03-01 12 views
10

acabo comenzó a trabajar con Dapper y no parece encontrar algo muy simple como el mapeo de una entidad a una tabla en mi base de datos:de asignación de entidades en Dapper

Tengo un procedimiento almacenado:

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

end 
go 

a continuación, 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 apuesto una consulta 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 me gustaría hacer algo como esto:

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

¿Cómo puede lo anterior se logrará en pulcro?

Respuesta

15

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 he entendido bien que usted no desea alias en el TSQL, y no desea ningún propiedades pass-thru - a continuación, utilizar la no genérico 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(); 

o tal vez 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 el no genérico Query(...) API utiliza dynamic, que ofrece hasta miembros por nombre de columna.

+0

¿Afecta el rendimiento hacerlo de esta manera? –

+2

@david no de una manera material, tal vez un 2% más lento –

3

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

Una vez que tenga el resultado de nuevo debe asignar manualmente a otra clase (o utilizar AutoMapper)

1

usted podría intentar algo como esto:

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 
} 

Podría ser excesiva para el ejemplo, pero he encontrado que es útil en algunas situaciones para evitar llenar cada consulta <> llamar con el código de reasignación.

+0

Preferiría manejar esta asignación en el código Query <> que atestar mis objetos y vincularlos a la capa de datos –

0

Recomendaría NReco para usted. Es eficiente como apuesto pero con un mapeo fácil con atributos. nreco