我已完成以下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的代码:
(连接是一个对象,代表我与数据库的连接字符串)
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,Amount ='128.42'}}-当有研究记录时。

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

我知道Dapper的返回值是一种类型:动态{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建议将“动态”更改为“无功”。

因此,为了记录在案,最终代码如下所示:
cn.Open();
var result = cn.Query(sql, new { ID = serviceId }).SingleOrDefault();

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

return amount;

最佳答案

您可以使用动态类型:

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()

关于c# - 如何在返回单个结果的查询中从DapperRow获取值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46626372/

10-10 02:02