【问题标题】:How to use Dapper asynchronously with multiple stored procedure calls?如何通过多个存储过程调用异步使用 Dapper?
【发布时间】:2019-01-22 03:22:36
【问题描述】:

我在一个带有 SQL Server 数据库的 ASP.Net Core 2.1 CRUD 应用程序中使用 Dapper ORM。对于我正在开发的新表单,我想在调用屏幕时一次性检索所有参考数据(以填充SELECT 字段选项)。这涉及到一系列存储过程调用,我希望异步执行这些调用以获得最佳性能。

This Dapper tutorial 建议我应该考虑使用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;
    }
}

这在我的测试环境中运行良好,但我不确定它是否是执行异步查询的正确方法。特别是,我有以下担忧:

  1. 它是否足够强大以在实时操作中受到信任?

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

【问题讨论】:

  • 你尝试过这样的事情吗?

标签: asp.net asynchronous stored-procedures dapper


【解决方案1】:

你尝试过这样的事情吗?

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;
    }
}

【讨论】:

  • 感谢您的建议。我确实尝试过,但它出错了,因为它无法识别“Read”中的“countryDetails”,可能是因为这是一个 C# 构造,而它需要一个 SQL 实体,例如表名。我可以考虑解决这个问题,但我觉得我会失去 C# 代码和存储过程之间的逻辑分离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多