je l'ai fait la requête SQL suivante:Comment obtenir la valeur de DapperRow dans une requête qui renvoie un seul résultat
SELECT SUM(SI.UnitaryValue) as Amount
FROM Services as S
INNER JOIN ServicesItems as SI
ON S.ServiceId = SI.ServiceId
WHERE S.ServiceId = @ID"
Dans la requête: Services dispose d'une collection d'éléments de service. Ensuite, la requête renvoie une seule cellule avec la somme des valeurs unitaires de chaque élément de service.
Voici mon code avec Dapper: (La connexion est un objet qui représente ma chaîne de connexion à la base de données)
using (var cn = Connection)
{
var sql = @"SELECT SUM(SI.UnitaryValue) as Amount
FROM Services as S
INNER JOIN ServicesItems as SI
ON S.ServiceId = SI.ServiceId
WHERE S.ServiceId = @ID";
cn.Open();
var result = cn.Query(sql, new { ID = serviceId }).SingleOrDefault();
// ... ??
return Amount;
}
type montant doit être décimal.
Quand je lance en mode débogage, et l'analyse de la fenêtre Locals je reçois deux valeurs possibles:
1- {{DapperRow, Montant = « 128,42 »}} - quand il y a des dossiers pour la recherche.
2- {{DapperRow, Amount = NULL}} - lorsqu'il n'y a pas d'enregistrements.
Je sais que le retour de Dapper est un type: dynamique {} Dapper.SqlMapper.DapperRow
Je ne peux pas accéder aux données renvoyées et recouvrer les montants.
J'ai déjà regardé https://github.com/StackExchange/Dapper et je n'ai pas "vu" la réponse. Au moins, ce que j'ai trouvé et essayé de mettre en œuvre n'a pas fonctionné.
J'ai trouvé cet article ici Dapper: How to get value from DapperRow if column name is "count(*)"?, mais puisque le code présenté dans la question est partiel et en réponse aussi. Je ne pouvais pas mettre en œuvre correctement. Il a fait une erreur aussi.
J'ai essayé ce code, mais il ne fonctionne pas:
var result = (IDictionary<string,object>)cn.Query(sql,
new { ID = serviceId }).SingleOrDefault();
return result["Amount"]
Edité après la solution de Darthchai:
Après avoir écrit votre code avec "dynamique", Visual Studio me nécessaire d'ajouter la référence 'Microsoft.CSharp'. Après cela, ReSharper a suggéré de changer le "dynamique" en "var".
Pour le compte rendu, le code final ressemble à ceci:
cn.Open();
var result = cn.Query(sql, new { ID = serviceId }).SingleOrDefault();
decimal amount = (result != null && result?.Amount == null) ? 0 : result?.Amount;
return amount;