Сопоставление объекта в 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; }
}

И в моем коде есть запрос dapper:

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?

Ответ 1

У Dapper сознательно нет слоя отображения; это абсолютный минимум, который может работать, и откровенно покрывает большинство реальных сценариев в этом процессе. Однако, если я правильно понял, что вы не хотите использовать псевдоним в TSQL и не хотите каких-либо свойств pass-thru, а затем используйте не-общий API Query:

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, предлагая члены для каждого имени столбца.

Ответ 2

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

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

Ответ 3

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

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 < с кодом переназначения.

Ответ 4

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