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
相关产品推荐
相关产品推荐

