[英]Mapping entity in 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; }
}
我的代碼中有一個精巧的查詢:
int userid=1;
User User = connection.Query<User>("#GetUserById", new {userid=userid}, commandType: CommandType.StoredProcedure).FirstOrDefault();
我的問題是:如何告訴我的實體用戶我的數據庫中的Id是Userid?
在EF我會做這樣的事情:
MapSingleType(c => new
{
UserId = c.Id,
Firstname = c.Firstname,
Lastname = c.Lastname,
EmailAddress = c.Email
}).ToTable("users");
如何在短小精悍的情況下實現上述目標?
Dapper故意沒有映射層; 它是可以工作的絕對最小值,坦率地涵蓋了該過程中的大多數真實場景。 但是,如果我正確理解您不想在TSQL中使用別名,並且不需要任何pass-thru屬性 - 那么請使用非泛型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
,每列名稱提供成員。
它不能,必須定義您的用戶類以匹配從查詢返回的結果。
一旦得到結果,你必須手動將它映射到另一個類(或使用AutoMapper)
你可以嘗試這樣的事情:
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 <>調用。
我會向你推薦NReco。 它像dapper一樣高性能,但易於使用屬性進行映射。 nreco
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.