La manière la plus simple d'utiliser Dapper ORM

c# dapper object

Question

Quel est le moyen le plus simple d'obtenir la sortie d'une requête Dapper ORM dans les membres de données de la classe qui fournit la méthode pour la requête?

Ceci est mon code avec une méthode A (moche) et B (ne fonctionne pas):

public class MyLab_ClientRef
{
    public int UserId { get; set; }
    public string ClientId { get; set; }
    // ... more fields ...

    public bool GetUser(OracleConnection conn, int UserId, string ClientId)
    {
        bool Ok = false;
        IEnumerable<MyLab_ClientRef> QueryResultRecords =
            conn.Query<MyLab_ClientRef>(@"
                SELECT *
                FROM MyLab_ClientRef
                WHERE UserId   = :UserId
                  AND ClientId = :ClientId",
            new { UserId = UserId, ClientId = ClientId });
        if (QueryResultRecords.Count() == 1)
        {
            // Method A
            MyLab_ClientRef Rec = QueryResultRecords.First(); // works
            CopyRec(Rec, this);                               // ugly

            // Method B
            this = QueryResultRecords.First();            // avoids CopyRec, does not work

            Ok = true;
        }
        return Ok;
    }

    private static void CopyRec(MyLab_ClientRef CR_From, MyLab_ClientRef CR_To)
    {
        CR_To.UserId = CR_From.UserId;
        CR_To.ClientId = CR_From.ClientId;
    }
}

J'aime garder la définition de l'enregistrement proche de la requête qui obtient l'enregistrement, mais n'aime pas implémenter de cette façon une méthode CopyRec pour chaque classe de table.

N'y a-t-il pas de meilleur moyen de le mettre en œuvre? J'ai essayé d'écrire this = ... mais ce n'est pas possible.

Comment écrire une méthode B meilleure que la méthode A?

Réponse acceptée

Suivant ne fonctionnerait pas:

this = QueryResultRecords.First();

Vérifiez les liens suivants pour savoir pourquoi:

Pourquoi ne puis-je pas définir "this" sur C #?

MSDN

Comme indiqué dans le premier lien ci-dessus, votre meilleure option reste de renvoyer le MyLab_ClientRef partir d'une méthode donnée, de le rendre statique et de l'utiliser pour l'attribution de value or reference

Vérifiez les points suivants si cela peut être une implémentation plus propre à votre avis:

public class MyLab_ClientRef
{
    public int UserId { get; set; }
    public string ClientId { get; set; }
    // ... more fields ...

    public static MyLab_ClientRef GetUser(OracleConnection conn, int UserId, string ClientId)
    {
        bool Ok = false;

        var QueryResultRecords =
            conn.Query<MyLab_ClientRef>(@"SELECT * FROM MyLab_ClientRef WHERE UserId = :UserId AND ClientId = :ClientId",new { UserId = UserId, ClientId = ClientId });

            if(QueryResultRecords.Any())
                return QueryResultRecords.First();
            else
                return null;        

    }  
}

Il peut être appelé comme:

var newClient = MyLab_ClientRef.GetUser(conn, UserId,ClientId);

Il serait préférable si l'objet de connection est local à une méthode et est utilisé dans l'horloge d' using



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