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

使用Dapper.QueryMultiple执行多查询返回结果遇类型转换错误且Postman无数据

问题根因

  • 封装方法声明的返回值类型与实际返回的内容类型不匹配,最早的方法要求返回IEnumerable<RequestOverview>,但实际返回的是List<string>,直接触发类型转换错误
  • 控制器调用业务方法后没有将返回值传入Ok()方法,即使逻辑正常运行,Postman也只能拿到200状态码,没有实际响应数据
  • 后续调整的代码中直接对列表对象调用ToString(),只会输出类的全限定名,无法返回列表的实际内容

解决方案

步骤1:定义承载多结果的返回模型

单独创建一个强类型模型用来同时承载两个查询的结果,方便序列化和前端解析:

public class MultiQueryResult
{
    public List<VehicleReg> VehicleList { get; set; } = new();
    public List<TestIgen> OwnerList { get; set; } = new();
}

步骤2:修改封装的查询方法

修正异步方法的写法,使用Dapper对应的异步API,返回我们定义的多结果模型:

public async Task<MultiQueryResult> GetMultiData()
{
    string query = @"SELECT TOP 5 RegNumber as vehicleRegNr FROM [dbo].[Vehicle];
                     SELECT TOP 5 Name as ownerName FROM [dbo].[Customer];";

    using var multi = await _sqlconnection.QueryMultipleAsync(query);
    var vehicles = multi.Read<VehicleReg>().ToList();
    var owners = multi.Read<TestIgen>().ToList();

    return new MultiQueryResult
    {
        VehicleList = vehicles,
        OwnerList = owners
    };
}

步骤3:修改控制器逻辑

将查询到的结果传入Ok()方法,返回给调用端:

[HttpGet]
public async Task<IActionResult> testa()
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    try
    {
        var result = await _request.GetMultiData();
        return Ok(result);
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

补充说明

如果不想单独创建返回模型,也可以直接返回匿名类,直接在控制器中组装结果返回即可,不过强类型模型更方便后期维护和接口文档生成。
另外要注意所有异步操作都要添加await关键字,避免出现线程死锁或者方法提前返回的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:39:02