You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何从ReadFirstOrDefaultAsync返回多个变量值并赋值给模型

问题修复方案

你的现有代码存在两处冗余设计:一是重复打开了两次数据库连接,二是用QueryAsync<(int, int)>读取两个独立SELECT结果集的用法不符合Dapper的设计逻辑,无法正确拿到两个计数结果。

你已经通过QueryMultipleAsync拿到了多结果集读取器,直接 await 两次读取操作返回对应结果即可,无需二次查询:

// 这里给元组字段命名,后续赋值给模型时可读性更高,也可以保留(int, int)无命名写法
public async Task<(int ProductCount, int UnitCount)> GetCount(int CustId, string userId)
{
    _log.Info($"Enter- GetCount");
    const string query = @" Select count(*) from Products
                            Select count(*) from Units";
    using (IDbConnection myConnection = _getConnection.GetConnection(GetConnectionStringFromDict(userId)))
    {
        using (var multi = await myConnection.QueryMultipleAsync(query, new { CustId }).ConfigureAwait(false))
        {
            // 等待异步读取完成拿到两个计数结果
            var item1 = await multi.ReadFirstOrDefaultAsync<int>().ConfigureAwait(false);
            var item2 = await multi.ReadFirstOrDefaultAsync<int>().ConfigureAwait(false);
            _log.Info($"Exit- GetCount");
            // 直接返回两个值组成的元组
            return (item1, item2);
        }
    }
}

赋值给模型的用法

方式1:用命名元组直接读取

var countRes = await GetCount(你的CustId, 你的userId);
// 对应赋值给模型字段即可
你的模型.ProductsTotal = countRes.ProductCount;
你的模型.UnitsTotal = countRes.UnitCount;

方式2:解构赋值(无命名元组也可以用)

var (productCount, unitCount) = await GetCount(你的CustId, 你的userId);
你的模型.ProductsTotal = productCount;
你的模型.UnitsTotal = unitCount;

补充说明

  • 原有代码中重复的Exit日志逻辑已经合并到读取完成后,避免重复打印
  • 如果不需要明确的元组字段名,把方法返回值改回Task<(int, int)>即可正常使用

内容的提问来源于stack exchange,提问作者Suvarna S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 04:06:10