Картографирование сущности в Dapper - PullRequest
11 голосов
/ 01 марта 2012

Я только начал работать с 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 - это идентификатор пользователя в моей базе данных?

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

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

Как можно достичь вышеизложенного в dapper?

Ответы [ 4 ]

19 голосов
/ 01 марта 2012

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

Хитрость в том, что неуниверсальный API Query(...) использует dynamic, предлагая количество членов для имени столбца.

3 голосов
/ 01 марта 2012

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

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

2 голосов
/ 29 августа 2012

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

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 <> кодом переотображения.

0 голосов
/ 06 ноября 2016

Я бы порекомендовал вам NReco.Он производительный, как изящный, но с простым сопоставлением с атрибутами. nreco

...