Asp.net 如何在多个存储过程调用中异步使用Dapper?

Asp.net 如何在多个存储过程调用中异步使用Dapper?,asp.net,asynchronous,stored-procedures,dapper,Asp.net,Asynchronous,Stored Procedures,Dapper,我正在ASP.NETCore2.1CRUD应用程序中使用简洁的ORM,并带有SQLServer数据库。对于我正在开发的新表单,我希望在调用屏幕时一次性检索所有参考数据(以填充SELECTfieldoptions)。这涉及到一系列存储过程调用,我希望异步执行这些调用以获得最佳性能 建议我应该考虑使用QueryMultipleAsync,但我找不到它与存储过程一起使用的示例,只有硬编码的SQL语句 我的C#代码目前如下所示: public async Task<ContactReference

我正在ASP.NETCore2.1CRUD应用程序中使用简洁的ORM,并带有SQLServer数据库。对于我正在开发的新表单,我希望在调用屏幕时一次性检索所有参考数据(以填充
SELECT
fieldoptions)。这涉及到一系列存储过程调用,我希望异步执行这些调用以获得最佳性能

建议我应该考虑使用
QueryMultipleAsync
,但我找不到它与存储过程一起使用的示例,只有硬编码的SQL语句

我的C#代码目前如下所示:

public async Task<ContactReferenceData> Get()
{
    ContactReferenceData refData = new ContactReferenceData();

    try
    {
        using (IDbConnection dbConnection = _connection)
        {
            dbConnection.Open();
            var countryData = await dbConnection.QueryAsync<Country>(sql: "usp_GetCountries", commandType: CommandType.StoredProcedure);
            refData.CountryDetails = countryData.AsList();
            var companyData = await dbConnection.QueryAsync<Company>(sql: "usp_GetCompanies", commandType: CommandType.StoredProcedure);
            refData.CompanyDetails = companyData.AsList();
            var groupData = await dbConnection.QueryAsync<Group>(sql: "usp_GetGroups", commandType: CommandType.StoredProcedure);
            refData.GroupDetails = groupData.AsList();
            var groupPositionData = await dbConnection.QueryAsync<GroupPosition>(sql: "usp_GetGroupPositions", commandType: CommandType.StoredProcedure);
            refData.GroupPositionDetails = groupPositionData.AsList();
        }

        return refData;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex.ToString());
        throw;
    }
}
公共异步任务Get() { ContactReferenceData refData=新的ContactReferenceData(); 尝试 { 使用(IDbConnection dbConnection=\u连接) { dbConnection.Open(); var countryData=await dbConnection.querySync(sql:“usp_GetCountries”,commandType:commandType.storedProcess); refData.CountryDetails=countryData.AsList(); var companyData=await dbConnection.QueryAsync(sql:“usp_getcompanys”,commandType:commandType.storedProcess); refData.CompanyDetails=companyData.AsList(); var groupData=await dbConnection.QueryAsync(sql:“usp_GetGroups”,commandType:commandType.storedProcess); refData.GroupDetails=groupData.AsList(); var groupPositionData=await dbConnection.QueryAsync(sql:“usp_GetGroupPositions”,commandType:commandType.storedProcess); refData.GroupPositionDetails=groupPositionData.AsList(); } 返回参考数据; } 捕获(例外情况除外) { _logger.LogError(例如ToString()); 投掷; } } 这在我的测试环境中工作正常,但我不确定这是执行异步查询的正确方法。我特别关注以下问题:

  • 它是否足够健壮,可以在实时操作中获得信任

  • 在其当前形式中,它是最大限度地发挥异步操作的好处(如果有的话),还是应该使用
    QueryMultipleAsync
    来正确地实现这一点


  • 你试过这样的东西吗

    public async Task<ContactReferenceData> Get()
    {
       var sql = "EXEC usp_GetCountries; EXEC usp_GetCompanies; EXEC usp_GetGroups; EXEC usp_GetGroupPositions";
        ContactReferenceData refData = new ContactReferenceData();
    
        try
        {
            using (IDbConnection dbConnection = _connection)
            {
                using (var multi = connection.QueryMultipleAsync(sql: sql, commandType: CommandType.StoredProcedure ).Result)
        {
            refData.CountryDetails = multi.Read<countryDetails>().ToList();
            refData.CompanyDetails = multi.Read<CompanyDetails>().ToList();
            refData.GroupData = multi.Read<Groups>().ToList();
            refData.GroupPositionsData= multi.Read<GroupPositions>().ToList();
        }
            }
    
            return refData;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex.ToString());
            throw;
        }
    }
    
    公共异步任务Get() { var sql=“EXEC usp\u GetCountries;EXEC usp\u getcompanys;EXEC usp\u GetGroups;EXEC usp\u GetGroupPositions”; ContactReferenceData refData=新的ContactReferenceData(); 尝试 { 使用(IDbConnection dbConnection=\u连接) { 使用(var multi=connection.querymultiplesync(sql:sql,commandType:commandType.StoredProcedure).Result) { refData.CountryDetails=multi.Read().ToList(); refData.CompanyDetails=multi.Read().ToList(); refData.GroupData=multi.Read().ToList(); refData.GroupPositionsData=multi.Read().ToList(); } } 返回参考数据; } 捕获(例外情况除外) { _logger.LogError(例如ToString()); 投掷; } }
    您尝试过类似的方法吗?谢谢您的建议。我确实试过了,但它出错了,因为它没有在“Read”中识别“countryDetails”,可能是因为这是一个C#构造,而它在那里需要一个SQL实体,比如一个tablename。我可以考虑修复它,但我觉得我会失去C代码和存储过程之间的逻辑分离。