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