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?
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 #?
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