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

