簡體   English   中英

從 dapper 中的多個查詢返回可枚舉的結果

[英]Returning ienumerable result from multiple query in dapper

我一直在嘗試創建使用 dapper 的 QueryMultiple 的方法。 我已經設法讓多個查詢工作,當我調試時,我可以看到數據庫中的值被返回。 但是,我想在調用API時看到Postman中的數據。 這是問題開始的地方,因為我似乎無法讓任何返回類型起作用,所以幾乎總是相同的錯誤。 錯誤幾乎總是關於“無法轉換”。 錯誤示例如下:

Error   CS1503  Argument 1: cannot convert from 'string' to 'V4ReactAPI.Models.V4RequestSite.ViewModels.RequestOverview'    WebApi  C:\gitrepo\V4\V4ReactWebApi\Models\V4RequestSite\Repository\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?)   WebApi  C:\gitrepo\V4\V4ReactWebApi\Models\V4RequestSite\Repository\RequestRepo.cs  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();
    }

這直接拋出了一個錯誤( CS0266如前所示)。

基本上,我需要以某種方式返回var vehiclesvar test ,以便能夠在例如 postman 中調用 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;
}

如果我理解正確,你想返回一個vehicleRegNrownerName的列表。 所以list1.ToString(); 在這種情況下沒有任何意義,因為它是一種List<VehicleReg>

在添加到allQueries之前,您需要select字段( vehicleRegNr來自VehicleRegownerName來自TestIgen )。

所以這

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM