2017-10-08 2 views
0

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; 

Répondre

0

Vous pouvez utiliser le type dynamique:

dynamic result = cn.Query(sql, 
     new { ID = serviceId }).SingleOrDefault() 

return result.Amount 

Ou si vous ne voulez pas utiliser dynamique, vous pourriez créer une classe pour contenir votre résultat, comme ci-dessous

class DbResult 
{ 
    public decimal Amount { get; set; } 
} 

Ensuite, lors de la définition de votre variable de résultat, passez la classe dans le dapp méthode de requête comme vu ci-dessous:

var result = cn.Query<DbResult>(sql, 
    new { ID = serviceId }).SingleOrDefault()