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