You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebApi返回DateTime类结果异常,Dapper执行SQL正确但接口返回值为0如何解决?

问题排查与修改方案

核心错误点

  • 参数传递不匹配:SQL语句中筛选条件使用@id参数,但Dapper传参时传入的是未定义的cnpj变量对应doc字段,既没有匹配SQL里的@id参数,也没有使用接口方法传入的id参数,导致筛选条件失效,查询不到符合条件的数据,SUM结果自然为0。
  • 查询字段别名与实体属性不匹配:SQL中求和字段别名是Monthly Value,但接口返回的实体类(PeriodoComissao/Test)对应的数值属性是valor,Dapper无法完成字段映射,会默认给数值类型赋值为0。
  • 方法参数未生效:接口方法定义了initialDate、endDate入参,但代码里硬写死了查询日期范围,没有使用传入的日期参数,可能查询范围和你直接跑SQL的范围不一致。
  • 异步方法未适配:方法声明为async Task类型,但内部调用的是同步的Dapper查询方法,没有加await异步调用,会导致方法执行逻辑异常。
  • 返回类型不匹配:查询返回的是PeriodoComissao类型对象,但方法定义的返回类型是Test,如果两个类的属性定义不一致也会导致映射失败。

修改后代码示例

// 首先确保你的返回类Test属性定义和返回字段匹配,示例如下:
// public class Test 
// {
//     public DateTime periodo { get; set; }
//     public decimal valor { get; set; }
// }

public async Task<Test> GetTestValue(string initialDate, string endDate, string id)
{
    // 优先使用接口传入的日期参数,可根据业务需求补充日期格式合法性校验
    DateTime inicio = Convert.ToDateTime(initialDate);
    DateTime fim = Convert.ToDateTime(endDate);

    // 字段别名和实体属性保持一致,Dapper会自动处理DateTime类型参数的SQL映射,无需额外CAST
    var query = @"Select SUM(VlBruto) as valor, MAX(DtReference) as periodo
                from tb.testValue ttv
                where idTest = @id 
                and DtReference >= @i 
                and DtReference <= @e";

    // 参数名和SQL里的参数一一对应,使用方法传入的id,调用异步查询方法加await
    var res = await _wizDBDapperContext.DapperConnection.QuerySingleOrDefaultAsync<Test>(query, new { id = id, i = inicio, e = fim});
    // 处理查询结果为空的边界情况,避免返回null
    return res ?? new Test { valor = 0, periodo = default };
}

内容的提问来源于stack exchange,提问作者Pedro Martins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:27:05