首页 > 解决方案 > 从 dapper 中的多个查询返回可枚举的结果

问题描述

我一直在尝试创建使用 dapper 的 QueryMultiple 的方法。我已经设法让多个查询工作,当我调试时,我可以看到数据库中的值被返回。但是,我想在调用 API 时查看 Postman 中的数据。这是问题开始的地方,因为我似乎无法让任何返回类型工作,它几乎总是相同的错误。该错误几乎总是与“无法转换”有关。错误示例如下:

Error   CS1503  Argument 1: cannot convert from 'string' to \RequestRepo.cs 45  Active

Error   CS0266  Cannot implicitly convert type 'System.Collections.Generic.List<string>' to 'System.Collections.Generic.IEnumerable<V4ReactAPI.Models.V4RequestSite.ViewModels.RequestOverview>'. An explicit conversion exists (are you missing a cast?) 90    Active

控制器看起来像:

    [HttpGet]
    public async Task<IActionResult> testa(RequestOverview model)
    {

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        try
        {
            await _request.testa(model);
        }
        catch (Exception ex)
        {

            return BadRequest(ex.Message);
        }
        return Ok();
    }

该模型:

public class VehicleReg
{
    public string vehicleRegNr { get; set; } = "";
}

public class TestIgen
{
    public string ownerName { get; set; } = "";
}

(整个模型类的名称是RequestOverview

现在我在自己的类中拥有的方法:

    public async Task<IEnumerable<RequestOverview>> testa(RequestOverview model)
    {

        string query = "SELECT TOP 5 RegNumber as vehicleRegNr FROM [dbo].[Vehicle];
        SELECT TOP 5 Name as ownerName FROM [dbo].[Customer];";

        var result = _sqlconnection.QueryMultiple(query);
        var vehicles = result.Read<VehicleReg>();
        var test = result.Read<TestIgen>();
        List<string> allQueries = new List<string>();

        foreach (var item in vehicles)
        {
            allQueries.Add(item.vehicleRegNr);
        }

        foreach (var item in test)
        {
            allQueries.Add(item.ownerName);

        return allQueries.ToList();
    }

这会直接引发 ERROR(CS0266如前所示)。

基本上,我需要以某种方式返回var vehiclesvar test返回,以便能够在例如在邮递员中调用 api 时获取要显示的数据。

我也尝试过这种方法,但我再次无法返回数据:

 public async Task<bool> Test()
        {

          string query = "SELECT TOP 5 RegNumber as vehicleRegNr FROM [dbo].[Vehicle];
          SELECT TOP 5 Name as ownerName FROM [dbo].[Customer];";

            var result = _sqlconnection.QueryMultiple(query);

            using (var multi = _sqlconnection.QueryMultiple(query, null))
            {
              List<VehicleReg> list1 = multi.Read<VehicleReg>().AsList();
              List<TestIgen> list2 = multi.Read<TestIgen>().AsList();
            }

            return true;
        }

有人对如何返回数据有任何想法吗?

[更新]我尝试了以下方法来避免转换错误,但是当我在 Postman 中尝试时它仍然没有返回任何数据:

public async Task<List<string>> Test()
{

  string query = "SELECT TOP 5 RegNumber as vehicleRegNr FROM [dbo].[Vehicle];
  SELECT TOP 5 Name as ownerName FROM [dbo].[Customer];";
    List<string> allQueries = new List<string>();
    using (var multi = _sqlconnection.QueryMultiple(query, null))
   {
        //List<string> allQueries = new List<string>();
        List<VehicleReg> list1 = multi.Read<VehicleReg>().AsList();
        List<TestIgen> list2 = multi.Read<TestIgen>().AsList();
        //return list1.ToList();
        allQueries.Add(list1.ToString());
        allQueries.Add(list2.ToString());
    }
    return allQueries;
}

标签: c#sqlasp.net-coredapper

解决方案


如果我理解正确,您想返回vehicleRegNrand的列表ownerName。所以list1.ToString();在这种情况下没有任何意义,因为它是List<VehicleReg>.

在添加到您的. select_vehicleRegNrVehicleRegownerNameTestIgenallQueries

所以这

allQueries.Add(list1.ToString());
allQueries.Add(list2.ToString());

应该

allQueries.AddRange(list1.Select(i => i.vehicleRegNr));
allQueries.AddRange(list2.Select(i => i.ownerName));

而且,如果您想从 API 返回该值,则需要使用OK给定的结果,如下所示:

[HttpGet]
public async Task<IActionResult> testa(RequestOverview model)
{

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    try
    {
        return Ok(await _request.testa(model);
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
    return Ok();
}

请参阅ASP.NET Core 返回带有状态码的 JSON


推荐阅读