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

