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

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

金额类型必须是小数。

当我在 Debug 模式下运行并分析 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 的解决方案编辑:

在我使用“动态”编写您的代码后,Visual Studio 要求我添加引用“Microsoft.CSharp”。 之后,ReSharper 建议将“dynamic”更改为“var”。

所以为了记录,最终代码如下所示:

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/

相关文章:

c# - HTTP 响应中的无效字符集

asp.net-mvc - 具有多个数据库或提供程序的 MVC4 简单成员身份验证

c# - 还记得 .net 中的 SQL 连接状态吗?

c# - 包含 TableValueParameter 的 Dapper 存储过程

c# - 从外部或变量传递表名到 INSERT INTO 表名?

c# - 我可以在 WPF 中使用 "defeat"SizeToContent 的面板吗?

c# - 处理 DataReceivedEventArgs 事件未触发

c# - 从表中获取 auto_increment id

c# - EF5 IQueryable 不包含 ToListAsync 的定义

asp.net-mvc - IWindsorContainer 与 IUnityContainer 有什么区别?