À l'aide de Dapper QueryAsync pour retourner un objet unique
Malheureusement notre DB, est datée des années 90. Son héritage est si forte que nous sommes encore à l'aide de SP afin de faire la plupart des opérations CRUD. Cependant, il semble que Dapper convient assez bien et nous avons tout juste commencé à jouer avec.
Cependant, je suis un peu inquiet de la façon de gérer une seule ligne de données. Dans ce cas, je suis en utilisant QueryAsync à l'appel de la SP passage d'un ID. Comme vous pouvez le voir, l'objet est de retourner à l'extérieur de l'appel asynchrone(*).
Je vais être en difficulté? Si oui, est-ce que quelqu'un sait comment le gérer? Dois-je utiliser un QuerySync à la place?
public class SchemePolicyRepository : ISchemePolicyRepository
{
private readonly SqlConnection sql;
protected SchemePolicyRepository(SqlConnection connection)
{
sql = connection;
}
...
public async Task<SchemePolicy> GetById(string id)
{
var schemePolicy = await sql.QueryAsync<SchemePolicy>("risk.iE_GetSchemePolicyById",
new { Id = id },
commandType: CommandType.StoredProcedure);
return schemePolicy != null ? schemePolicy.FirstOrDefault() : null;
}
...
}
(*)La SchemePolicy objet renvoyé par FirstOfDefault() n'est pas une méthode asynchrone.
Il n'y a rien de mal avec des procédures stockées, elles sont SQL tout comme le lourd, plus lent Orm générer.
Merci @YuvalItzchakov, j'ai mis à jour le post
vous avez raison, c'est pourquoi nous avons préféré utiliser Dapper, au lieu de EF. La vieille mode ADO.NET est encore quelque chose que nous aimons utiliser ici 🙂
Donc, fondamentalement, vous êtes inquiet parce que
FirstOrDefault
n'est pas asynchrone?
OriginalL'auteur Stefano Magistri | 2015-07-06
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je ne pense pas que vous avez besoin de la
null check
, Dapper sera de retour à zéro de la ligne pour une requête. PRENDRE NOTE que c'est VRAI pourSQL Server
mais doit être la même pour tous les autres SGBDR. Donc, cepeut être simplement écrit que
Maintenant pour aborder le vrai sujet de préoccupation, et que vous avez mentionné:
Ce n'est pas vrai. Si vous écrivez comme vous SEULEMENT obtenir votre objet après la requête est exécutée. Donc, la suite de deux ensemble de codes de rendement le même comportement:
et
Le souci est vraiment maintenant avec la façon dont vous appelez
GetById
pour s'assurer que (1) la méthode ne permet pas de bloquer n'importe quel autre thread et (2) que vous obtiendrez votre objet cible UNIQUEMENT lorsque la requête est terminée. Voici un extrait de code pour une Application de Console que vous pouvez le tester avec:Ce test va vous montrer que la
GetValue
qui appelle, en conséquence, laGetById
méthode ne bloque pas le reste du code. Aussi, que rien n'est retourné à partir deFirstOrDefault
jusqu'à ce que la requête a été traitée.Voici le code de prise en charge pour la requête au cas où quelqu'un veut l'essayer et de vérifier que le concept est valide (code fonctionne avec SQL Server 2008 et versions ultérieures):
OriginalL'auteur von v.