在Dapper中映射實體

.net c# dapper mapping orm

我剛剛開始使用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)



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因