C#异步业务处理中Treatment数据Count为0时的逻辑修正咨询
问题分析与解决方案
你的核心问题在于判断空数据的逻辑不对:你现在只检查了data == null,但很多仓储实现(比如EF Core)在没有数据时会返回空集合(Count=0)而非null,所以这个判断永远不会触发空数据的处理逻辑。
下面是修改后的完整代码,我会标注关键改动点:
public async Task<ApiResponse<IEnumerable<TreatmentResponse>>> Handle(TreatmentsQuery request, CancellationToken cancellationToken) { IEnumerable<Treatment> data = await _repo.Treatment.GetByCurrencyIdAsync(request.CurrencyId, request.languageId, request.predicate); // 关键改动1:同时检查null和空集合 if (data == null || !data.Any()) { // 关键改动2:用FirstOrDefaultAsync替代GetByIdAsync,避免多个默认语言时抛出异常 var defaultLanguage = await _repo.Language.FirstOrDefaultAsync(a => a.isDefault == true, cancellationToken); if (defaultLanguage != null && request.languageId != defaultLanguage.Id) { // 用默认语言ID重新查询数据 data = await _repo.Treatment.GetByCurrencyIdAsync(request.CurrencyId, defaultLanguage.Id, request.predicate); } // 如果你的需求是「同时返回原语言和默认语言的查询结果」,可以替换成下面的逻辑: // var defaultData = await _repo.Treatment.GetByCurrencyIdAsync(request.CurrencyId, defaultLanguage.Id, request.predicate); // data = (data ?? Enumerable.Empty<Treatment>()).Concat(defaultData); } // 关键改动3:处理data仍为null的情况,避免映射出错 var response = _mapper.Map<IEnumerable<TreatmentResponse>>(data ?? Enumerable.Empty<Treatment>()); return new SuccessApiResponse<IEnumerable<TreatmentResponse>>(response); }
关键细节说明:
- 空数据判断:
data == null || !data.Any()可以覆盖两种无数据场景:仓储返回null,或者返回空集合。 - 默认语言查询:
FirstOrDefaultAsync比GetByIdAsync更适合这里的场景——GetByIdAsync通常是按主键查询,而你是按isDefault == true条件筛选,可能存在多个默认语言的情况(虽然业务上应该避免),用FirstOrDefaultAsync能避免抛出异常。 - 空集合兜底:映射时用
data ?? Enumerable.Empty<Treatment>()确保即使data还是null,也能安全映射成空的响应集合。
内容的提问来源于stack exchange,提问作者user16695025
相关产品推荐
相关产品推荐

