如何在 returns 单个结果的查询中从 DapperRow 获取值
How to get the value from DapperRow in a query that returns a single result
我完成了以下 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"
在查询中:服务有一组服务项目。
然后,查询 return 是一个单元格,其中包含每个服务项的单位值的总和。
这是我使用 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;
}
金额类型必须是小数。
当我在调试模式下 运行 并分析本地 window 我得到两个可能的值:
1- {{DapperRow, Amount = '128.42'}} - 当有研究记录时。
2- {{DapperRow, Amount = NULL}} - 当没有记录时。
我知道 Dapper 的 return 是一种类型:动态 {Dapper.SqlMapper.DapperRow}
我无法访问 returned 数据并恢复金额。
我已经查看了 https://github.com/StackExchange/Dapper 但没有 "see" 答案。至少,我发现并尝试实施的方法没有成功。
我在这里 post 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 的解决方案进行编辑:
在我使用 "dynamic" 编写您的代码后,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 来保存您的结果,如下所示
class DbResult
{
public decimal Amount { get; set; }
}
然后在设置结果变量时将 class 传递到 dapper 查询方法中,如下所示:
var result = cn.Query<DbResult>(sql,
new { ID = serviceId }).SingleOrDefault()
我完成了以下 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"
在查询中:服务有一组服务项目。 然后,查询 return 是一个单元格,其中包含每个服务项的单位值的总和。
这是我使用 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;
}
金额类型必须是小数。
当我在调试模式下 运行 并分析本地 window 我得到两个可能的值:
1- {{DapperRow, Amount = '128.42'}} - 当有研究记录时。
2- {{DapperRow, Amount = NULL}} - 当没有记录时。
我知道 Dapper 的 return 是一种类型:动态 {Dapper.SqlMapper.DapperRow}
我无法访问 returned 数据并恢复金额。
我已经查看了 https://github.com/StackExchange/Dapper 但没有 "see" 答案。至少,我发现并尝试实施的方法没有成功。
我在这里 post 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 的解决方案进行编辑:
在我使用 "dynamic" 编写您的代码后,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 来保存您的结果,如下所示
class DbResult
{
public decimal Amount { get; set; }
}
然后在设置结果变量时将 class 传递到 dapper 查询方法中,如下所示:
var result = cn.Query<DbResult>(sql,
new { ID = serviceId }).SingleOrDefault()