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
相关产品推荐
相关产品推荐

