Entität in Dapper zuordnen

.net c# dapper mapping orm

Frage

Ich habe gerade angefangen, mit Dapper zu arbeiten, und ich finde nicht, dass etwas so Einfaches wie das Zuordnen einer Entität zu einer Tabelle in meiner Datenbank zu finden ist:

Ich habe eine gespeicherte Prozedur:

CREATE PROCEDURE [dbo].GetUserById (@UserId int)
AS  
begin               
        SELECT UserId,LastName,FirstName,EmailAddress
        FROM users
        WHERE UserID = @UserId

end
go

Dann eine Entität:

public class User
{
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
}

Und eine elegante Abfrage in meinem Code:

int userid=1;
    User User = connection.Query<User>("#GetUserById", new {userid=userid}, commandType: CommandType.StoredProcedure).FirstOrDefault();

Meine Frage ist: Wie kann ich meinem Entität Benutzer sagen, dass die ID Userid in meiner Datenbank ist?

In EF würde ich so etwas tun:

MapSingleType(c => new
            {
                UserId = c.Id,
                Firstname = c.Firstname,
                Lastname = c.Lastname,
                EmailAddress = c.Email
            }).ToTable("users");

Wie kann das oben im Dapper erreicht werden?

Akzeptierte Antwort

Dapper hat bewusst keine Mapping-Schicht; Es ist das absolute Minimum, das funktionieren kann, und deckt offen gesagt die Mehrheit der realen Szenarien ab. Wenn ich jedoch richtig verstehe, dass Sie keinen Alias ​​in der TSQL verwenden möchten und keine Pass-Thru-Eigenschaften möchten, verwenden Sie die nicht generische 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();

oder vielleicht einfacher im Falle eines einzelnen Datensatzes:

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
};

Der Trick dabei ist, dass die nicht generische Query(...) API dynamic , aufsteigende Elemente pro Spaltennamen verwendet.


Beliebte Antwort

Dies kann nicht geschehen. Ihre Benutzerklasse muss definiert werden, damit sie mit dem aus der Abfrage zurückgegebenen Ergebnis übereinstimmt.

Sobald das Ergebnis zurück ist, müssen Sie es manuell einer anderen Klasse zuordnen (oder AutoMapper verwenden).



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum