如何获得在返回单个结果
问题描述:
我已经做了下面的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;
答
您可以使用动态类型:
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()