ASP MVC Core 3x异步数据库调用-我没有得到什么?

问题描述

我希望有人能给我带来启发,因为我在VS中的一个异常与另一个异常之间跳来跳去,而我真的感到受够了。我已经阅读了有关如何执行异步调用文章,并查看了代码示例,但是由于某种原因,我还是无法按照VS的要求得到它。

我有一个简单的POCO,GetCompaniesResponse,其中将包含公司或错误的集合,具体取决于发生的情况:

public class GetCompanyResponse
{
    public List<Company> Companies { get; set; }
    public List<ErrorResult> Errors { get; set; }

    public GetCompanyResponse()
    {
        Companies = new List<Company>();
        Errors = new List<ErrorResult>();
    }
}

要做的就是将同步加载(从数据库加载公司的同步调用)转换为异步调用,以便在加载数据的同时释放UI。

这是我转换的方法

    public async Task<GetCompanyResponse> GetCompaniesByQuery()
    {
        var response = new GetCompanyResponse();

        try
        {
            using (var conn = new sqlConnection(_configuration["Settings:DBConn"]))
            {
                var cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT TOP (1000) company_id,company_name,postcode FROM dbo.tbl_companies";
                conn.open();
                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    response.Companies.Add(new Company
                    {
                        CompanyId = Convert.ToInt32(reader["company_id"]),CompanyName = reader["company_name"].ToString(),PostCode = reader["postcode"].ToString()
                    });
                }
            }
        }
        catch (Exception e)
        {
            response.Errors.Add(new ErrorResult
            {
                ErrorMessage = e.Message
            });
        }
        
        return response;
    }

我的控制器动作是:

    public async Task<IActionResult> ByQuery()
    {
        var service = new TestService(_configuration);
        var response = await service.GetCompaniesByQuery();

        return View(response);
    }

VS中的上述方法一直告诉我,我无法返回响应,因为它无法转换。我在做什么错了?

Severity    Code    Description Project File    Line    Suppression State
Error   CS0029  Cannot implicitly convert type 'TestApp.Models.GetCompanyResponse' to 'System.Threading.Tasks.Task<TestApp.Models.GetCompanyResponse>'  TestApp C:\Working copies\TestApp\TestApp\Services\TestService.cs   59  Active

如果我随后尝试提取严格处理响应POCO的Companies属性的任务元素,如下所示:

    public async Task<IActionResult> ByQuery()
    {
        var service = new TestService(_configuration);
        var response = new GetCompanyResponse();
        response.Companies = (await service.GetCompaniesByQuery()).ToList();

        return View(response);
    }

    public async Task<IEnumerable<Company>> GetCompaniesByQuery()
    {
        var response = new List<Company>();

        try
        {
            using (var conn = new sqlConnection(_configuration["Settings:DBConn"]))
            {
                var cmd = conn.CreateCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "SELECT TOP (1000) company_id,postcode FROM dbo.tbl_companies";
                conn.open();
                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    response.Add(new Company
                    {
                        CompanyId = Convert.ToInt32(reader["company_id"]),PostCode = reader["postcode"].ToString()
                    });
                }
            }
        }
        catch (Exception e)
        {
            //not implemented yet
        }

        await Task.WhenAll((IEnumerable<Task>)response);
        
        return response;
    }

虽然VS不再抱怨它,但是我却在运行代码时开始遇到无效的强制转换错误

InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List`1[TestApp.Models.Company]' to type 'System.Collections.Generic.IEnumerable`1[System.Threading.Tasks.Task]'.
TestApp.Services.TestService.GetCompaniesByQuery() in TestService.cs
+
            await Task.WhenAll((IEnumerable<Task>)response);
TestApp.Controllers.HomeController.ByQuery() in HomeController.cs
+
            response.Companies = (await service.GetCompaniesByQuery()).ToList();

当我看过的示例与上述示例完全相同时,对我来说这是为什么就没有原因。我在这里不明白什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)