如何在返回单个结果的查询中从DapperRow获取值

时间:2017-10-08 00:19:27

标签: c# asp.net-mvc dapper

我已完成以下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"

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

这是我与Dapper的代码: (Connection是表示我与数据库的连接字符串的对象)

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

金额类型必须为十进制。

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

1- {{DapperRow,Amount =' 128.42'}} - 当有研究记录时。

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

我知道Dapper的返回类型是:dynamic {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的解决方案之后编辑:

使用&#34; dynamic&#34;编写代码后,Visual Studio要求我添加引用&#39; Microsoft.CSharp&#39;。 之后,ReSharper建议改变&#34;动态&#34;到&#34; var&#34;。

因此,对于记录,最终代码如下所示:

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

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

return amount;

1 个答案:

答案 0 :(得分:3)

您可以使用动态类型:

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

 return result.Amount

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

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

然后,当设置结果变量时,将类传递给dapper查询方法,如下所示:

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