簡體   English   中英

在Dapper中映射實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM