2017-10-08 65 views
0

我已经做了下面的SQL查询的查询从DapperRow值:如何获得在返回单个结果

SELECT SUM(SI.UnitaryValue) as Amount 
     FROM Services as S 
INNER JOIN ServicesItems as SI 
     ON S.ServiceId = SI.ServiceId  
    WHERE S.ServiceId = @ID" 

在查询:服务有服务项目的集合。 然后,查询返回单个单元格,其中包含每个服务项目的单位值总和。

这里是我的代码以短小精悍: (连接是一个对象,表示我的连接字符串到数据库)

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; 
} 

金额类型必须是小数。

当我在调试模式下运行,并分析本地窗口中,我得到两个可能的值:

1- {{DapperRow,金额=“128.42”}} - 当有用于研究记录。

2 - {{DapperRow,Amount = NULL}} - 当没有记录时。

我知道小巧玲珑的回报是一个类型:动态{} Dapper.SqlMapper.DapperRow

我无法访问返回的数据,并恢复金额。

我已经看过https://github.com/StackExchange/Dapper并没有“看到”答案。至少,我发现并试图实施的东西没有成功。

我在这里发现了这个帖子Dapper: How to get value from DapperRow if column name is "count(*)"?,但是因为问题中提出的代码是部分的并且是相应的。我无法正确执行。他也犯了一个错误。

我尝试这样的代码,但没有奏效:

var result = (IDictionary<string,object>)cn.Query(sql, 
      new { ID = serviceId }).SingleOrDefault(); 

return result["Amount"] 

后Darthchai的解决方案编辑:

后,我把你的代码以 “动态” 时,Visual Studio需要我补充参考“Microsoft.CSharp”。 之后,ReSharper建议将“动态”更改为“var”。

所以备案,最后的代码如下所示:

cn.Open(); 
var result = cn.Query(sql, new { ID = serviceId }).SingleOrDefault(); 

decimal amount = (result != null && result?.Amount == null) ? 0 : result?.Amount; 

return amount; 

回答

0

您可以使用动态类型:

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

return result.Amount 

或者,如果你不想使用动态,你可以创建一个类来保存你的结果,如下所示

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

然后当设置你的结果变量传递类到dapp呃查询方法如下图所示:

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