2012-03-01 5 views
10

Я только начал работать с Dapper, и я, кажется, не найти что-то очень простое, как отображение объекта в таблицу в моей базе данных:Mapping объект в 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(); 

Мой вопрос: Как я могу сообщить своей сущности User, что Id является Userid в моей базе данных?

В EF я хотел бы сделать что-то вроде этого:

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

Как можно выше быть достигнуто в Dapper?

ответ

15

Щеголеватый намеренно не отображение слоя; это абсолютный минимум, который может работать, и откровенно покрывает большинство реальных сценариев в этом процессе. Однако, если я правильно понимаю, что вы не хотите, чтобы псевдоним в TSQL, и не хотите проходить-через свойство - а затем использовать необщий 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, предлагая членам одного имени столбца.

+0

Влияет ли производительность на выполнение этого способа? –

+2

@ david не в материальном смысле, возможно, на 2% медленнее –

3

Он не может, ваш пользовательский класс должен быть определен, чтобы соответствовать результату, возвращаемому из запроса.

После того, как вы получили результат обратно необходимо сопоставить его вручную к другому классу (или использовать AutoMapper)

1

Вы могли бы попробовать что-то вроде этого:

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 
} 

Это может быть избыточна для вашего примера, но я нашел, что это полезно в некоторых ситуациях, чтобы избежать загромождения каждого запроса <> коллировать с кодом переотображения.

+0

Предпочитаете обработать это сопоставление в коде Query <>, чем загромождать мои объекты и привязывать их к слою данных –

0

Я бы порекомендовал вам NReco. Он исполнен, как dapper, но с легким отображением с атрибутами. nreco