c# - 无法等待系统集合通用可枚举

标签 c# entity-framework async-await

我对异步编程非常陌生,我被要求在不破坏现有功能的情况下实现异步。 在我的 Web API 服务层中,我有这样的内容:

public IList<Entities.Case.CreateCaseOutput> createCase(ARC.Donor.Data.Entities.Case.CreateCaseInput CreateCaseInput, ARC.Donor.Data.Entities.Case.SaveCaseSearchInput SaveCaseSearchInput)
{
    Repository rep = new Repository();
    string RequestType = "Insert";
    string strSPQuery = string.Empty;
    List<object> listParam = new List<object>();
    SQL.CaseSQL.getCreateCaseParameters(CreateCaseInput, RequestType, out strSPQuery, out listParam);
    var AcctLst = rep.ExecuteStoredProcedure<Entities.Case.CreateCaseOutput>(strSPQuery, listParam).ToList();
    if (!string.IsNullOrEmpty(AcctLst.ElementAt(0).o_case_seq.ToString()))
        saveCaseSearch(SaveCaseSearchInput, AcctLst.ElementAt(0).o_case_seq);
    return AcctLst;
}

这个 SaveCaseSearch 是异步实现的:

public async Task<IList<Entities.Case.SaveCaseSearchOutput>> saveCaseSearch(ARC.Donor.Data.Entities.Case.SaveCaseSearchInput SaveCaseSearchInput,Int64? case_key)
{
    Repository rep = new Repository();
    string strSPQuery = string.Empty;
    List<object> listParam = new List<object>();
    SQL.CaseSQL.getSaveCaseSearchParameters(SaveCaseSearchInput, case_key,out strSPQuery, out listParam);
    var AcctLst = await rep.ExecuteStoredProcedure<Entities.Case.SaveCaseSearchOutput>(strSPQuery, listParam).ToList();
    return AcctLst;
}

但它说:

enter image description here

ExecuteStoredProcedure 看起来像:

public IEnumerable<T> ExecuteStoredProcedure<T>(string strSPQuery, List<object> parameters)
{
    _msg = "";
    try
    {
        this._context.Database.CommandTimeout = 280;

        return this._context.Database.SqlQuery<T>(strSPQuery, parameters.ToArray());

    }
    catch (Exception ex)
    {
        _msg = "ERROR: " + ex.Message;
        if (ex.InnerException != null) { _msg += "INNER EXCEPTION: " + ex.InnerException; }
        log.Info(_msg);
    }
    return null;
}

可以做什么? ToListAsync() 值得关注吗?当我尝试时,我得到了

enter image description here

并更改 ExecuteStoredProcedure 定义会产生

public Task<IEnumerable<T>> ExecuteStoredProcedure<T>(string strSPQuery, List<object> parameters)
{
    _msg = "";
    try
    {
        this._context.Database.CommandTimeout = 280;

        return this._context.Database.SqlQuery<T>(strSPQuery, parameters.ToArray());

    }
    catch (Exception ex)
    {
        _msg = "ERROR: " + ex.Message;
        if (ex.InnerException != null) { _msg += "INNER EXCEPTION: " + ex.InnerException; }
        log.Info(_msg);
    }
    return null;
}

错误:

错误 13 无法将类型“System.Data.Entity.Infrastruct.DbRawSqlQuery”隐式转换为“System.Threading.Tasks.Task>”C:\Users\m1034699\Desktop\Stuart_V2_12042016\Stuart Web Service\ARC .Donor.Data\Repository.cs 115 24 ARC.Donor.Data

我不知道该怎么做。请帮忙。

最佳答案

您必须使用异步版本的方法。

尝试:

var AcctLst = await rep.ExecuteStoredProcedure<Entities.Case.SaveCaseSearchOutput>(strSPQuery, listParam).ToListAsync();

关于c# - 无法等待系统集合通用可枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36571880/

相关文章:

c# - 让 EF Linq Select 语句选择常量或函数

c# - 新的C#异步功能的一个很好的非联网示例是什么?

swift - 什么决定了 Swift 5.5 Task 初始值设定项是否在主线程上运行?

c# - Entity Framework 中没有事务的存储过程

C# 等效于 DecryptByPassPhrase

c# - 带有 POCO + WCF + WPF 的 EF。在客户端重用 POCO 类还是使用 DTO?

javascript - 在继续 for 循环之前等待异步执行

c# - Linq2Sql - 使用本地集合作为子查询的一部分 - "queries with local collections are not supported"

c# - 设置处理器关联性和 TPL

asp.net-mvc - 如何在ASP.NET MVC应用程序区域中使用不同的 Entity Framework DbContext?