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

EF Core多条件查询:RequestAssignments为空时仍需返回记录

问题解决:EF Core中一对多关系为空时返回记录并正确过滤

问题根源

原查询里RequestAssignments.Any(...)的逻辑存在问题:当request.Assgments为空时,虽然表达式内部判断为true,但Any()方法要求集合中至少有一个元素满足条件,若RequestAssignments是空列表,Any()会返回false,导致整条记录被过滤掉。

解决方案

把关联集合的过滤条件拆成两个分支:

  • 当查询参数为空时,直接满足条件(不管关联集合是否为空)
  • 当查询参数不为空时,再检查关联集合中是否存在匹配项

同时对RequestPeople的条件做相同修复,避免出现同样的空集合过滤问题。

修改后的完整查询代码

var query = _mapper
    .ProjectTo<WorkTrayVm>(
        _unitOfWork
            .Requests
            .GetAllById(
                a => !a.DeletedRecord
                    && (request.RequestNo == null || (string.IsNullOrEmpty(a.RequestNo) || a.RequestNo.ToLower().Contains(request.RequestNo.ToLower())))
                    && (!request.TypeId.HasValue || a.TypeId == request.TypeId)
                    && (!request.RefferalChanelId.HasValue || a.ReferralChannelId == request.RefferalChanelId)
                    && (!request.StateId.HasValue || a.StatusId == request.StateId)
                    && (!request.DateFrom.HasValue || a.EntryDate >= request.DateFrom)
                    && (!request.DateTo.HasValue || a.EntryDate <= request.DateTo)
                    // 修复RequestPeople过滤逻辑
                    && (string.IsNullOrEmpty(request.ComplaintNumber) || a.RequestPeople.Any(aa => aa.People.Number.ToLower() == request.ComplaintNumber.ToLower()))
                    // 修复RequestAssignments过滤逻辑
                    && (string.IsNullOrEmpty(request.Assgments) || a.RequestAssignments.Any(aa => aa.Assigned.Email.ToLower() == request.Assgments.ToLower()))
                , false, false, request.PageNumber, request.PageSize))
    .OrderByDescending(a => a.Id)
    .ToList();

逻辑说明

  • 当request.Assgments为空时,条件直接为true,不会因为RequestAssignments是空集合而过滤记录
  • 当request.Assgments有值时,仅保留RequestAssignments中存在匹配Email的记录
  • 同理修复RequestPeople的条件,确保投诉号码为空时,不管RequestPeople是否为空都能返回对应记录

内容的提问来源于stack exchange,提问作者ASBEL SANTANA JIMENEZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:15:10