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

LINQ中Contains结合空字符串与非空字符串时始终返回false的问题

问题解决:空参数导致过滤条件失效的修复

问题根源

原代码有两个关键问题导致过滤失效:

  1. 逻辑运算符用错:所有条件用||(逻辑或)连接,只要任意一个条件成立(比如空字符串的Contains("")会匹配所有数据),就会返回该记录,完全起不到过滤作用。
  2. 空参数未做判断:当_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:42:12