Entité de cartographie dans Dapper

.net c# dapper mapping orm

Question

Je viens de commencer à travailler avec Dapper et je ne semble pas trouver quelque chose de très simple comme le mappage d'une entité sur une table dans ma base de données:

J'ai une procédure stockée:

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

end
go

Puis une entité:

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

Et une requête pimpante dans mon code:

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

Ma question est la suivante: comment puis-je dire à mon utilisateur que cet identifiant est Userid sur ma base de données?

En EF je ferais quelque chose comme ceci:

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

Comment ce qui précède peut-il être réalisé dans Dapper?

Réponse acceptée

Dapper n'a pas délibérément de couche de mappage; c'est le minimum absolu qui peut fonctionner et couvre franchement la majorité des scénarios réels du processus. Cependant, si je comprends bien que vous ne voulez pas créer d'alias dans TSQL, et ne voulez pas de propriétés pass-thru, utilisez alors l'API Query non générique:

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();

ou peut-être plus simplement dans le cas d'un enregistrement unique:

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

L'astuce ici est que l'API Query(...) non générique utilise la dynamic , offrant des membres par nom de colonne.


Réponse populaire

Cela n'est pas possible, votre classe d'utilisateurs doit être définie pour correspondre au résultat provenant de la requête.

Une fois le résultat obtenu, vous devez le mapper manuellement dans une autre classe (ou utiliser AutoMapper)




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi