LINQ中Contains结合空字符串与非空字符串时始终返回false的问题
问题解决:空参数导致过滤条件失效的修复
问题根源
原代码有两个关键问题导致过滤失效:
- 逻辑运算符用错:所有条件用
||(逻辑或)连接,只要任意一个条件成立(比如空字符串的Contains("")会匹配所有数据),就会返回该记录,完全起不到过滤作用。 - 空参数未做判断:当
_reportData.DistrictID、_reportData.BeneficieryID这类参数是空字符串时,b.District.Contains("")或b.Name.Contains("")会对所有记录返回true,直接让过滤形同虚设。
修复思路
- 先判断每个过滤参数是否为空/空字符串,只有参数有效时才应用对应的过滤规则
- 用
&&(逻辑与)连接所有有效条件,确保返回的是同时满足所有指定过滤要求的记录 - 修正异步方法的写法,原方法标注了
async但没用到await,不符合规范
修正后的代码
public async Task<IEnumerable<BeneficieryMasterExcelUpload>> GetBeneficieryReports(ReportsDataSearch _reportData) { try { var query = _appDBContext.BeneficieryMasterExcelUpload.AsQueryable(); // 过滤财政年度 if (!string.IsNullOrEmpty(_reportData.FinancialYear)) { query = query.Where(b => b.Financial_Year.Contains(_reportData.FinancialYear)); } // 过滤地区ID if (!string.IsNullOrEmpty(_reportData.DistrictID)) { query = query.Where(b => b.District.Contains(_reportData.DistrictID)); } // 过滤受益人ID(注意原代码里匹配的是Name字段,若实际要匹配BeneficieryID,修改下面的条件即可) if (!string.IsNullOrEmpty(_reportData.BeneficieryID)) { query = query.Where(b => b.Name.Contains(_reportData.BeneficieryID)); // 如果是匹配BeneficieryID字段,替换成这行: // query = query.Where(b => b.BeneficieryID.Contains(_reportData.BeneficieryID)); } // 过滤TalukID if (!string.IsNullOrEmpty(_reportData.TalukID)) { query = query.Where(b => b.Taluk.Contains(_reportData.TalukID)); } // 过滤VillageID if (!string.IsNullOrEmpty(_reportData.VillageID)) { query = query.Where(b => b.Village.StartsWith(_reportData.VillageID)); } // 过滤SchemeMasterID if (!string.IsNullOrEmpty(_reportData.SchemeMasterID)) { query = query.Where(b => b.SchemeName.Contains(_reportData.SchemeMasterID)); } var beneficieryList = await query.Select(b => new BeneficieryMasterExcelUpload { BeneficieryID = b.BeneficieryID, Name = b.Name, SchemeName = b.SchemeName, BusinessName = b.BusinessName, District = b.District, Taluk = b.Taluk, Village = b.Village, Constitunency_num = b.Constitunency_num, BankName = b.BankName, Financial_Year = b.Financial_Year, Religion = b.Religion, }).ToListAsync(); return beneficieryList; } catch (Exception ex) { // 建议这里添加日志记录,方便排查问题 // _logger.LogError(ex, "获取受益人报告失败"); return Enumerable.Empty<BeneficieryMasterExcelUpload>(); } }
额外提示
- 原代码重复写了两次
b.District.Contains(_reportData.DistrictID),修复时已移除重复项 - 异常处理返回空集合而非
null,能避免调用方出现空引用异常 - 异步方法里用
ToListAsync()替代ToList(),并加上await,符合异步编程的规范
内容的提问来源于stack exchange,提问作者Sneha
相关产品推荐
相关产品推荐

