IEnumerable.Any

本文关键字:Any IEnumerable | 更新日期: 2023-09-27 18:15:13

我有以下方法,它返回特定日期范围和状态的作业。问题是,当我使用IEnumerable时。任何情况下,它都会返回所有作业,甚至是那些没有指定状态的作业。是否有一种方法可以对其进行微调,使其只返回具有特定状态的工作?下面是代码:

public List<JobDTO> GetJobList(int domainID, DateTime? dateFrom, DateTime? dateTo, PlannedTravelStopStatusTypeEnum status)
{
    var context = new WebSchedulerContext();
    var list = new List<JobDTO>();
    if (dateFrom == null)
    {
        dateFrom = DateTime.MinValue;
    }
    if (dateTo == null)
    {
        dateTo = DateTime.MaxValue;
    }
    var jobs = context.Job.Include(j => j.PlannedJobStopDetails
          .Select(jsd => jsd.PlannedTravelStop)
        )
        .Where(j => j.MinimumStartDate >= dateFrom && j.MaximumEndDate <= dateTo &&
               **j.PlannedJobStopDetails.Any**(
                 jsd => jsd.PlannedTravelStop.PlannedTravelStopStatus == status
                 ));
    foreach (var job in jobs)
    {
        list.Add(new JobDTO(job));
    }
    return list;
}

有问题的代码片段是:

j.PlannedJobStopDetails.Any(jsd => 
    jsd.PlannedTravelStop.PlannedTravelStopStatus == status)

IEnumerable.Any

据我所知,JobPlannedJobStopDetails之间存在1:n的关系。

在你的声明中你说:给我一份工作,如果任何PlannedJobStopDetails(这是一个集合)有"状态"要找。也许你想说每个PlannedJobStopDetails都应该有相同的状态?

然后你需要将"Any"改为"All":

    var jobs = context.Job.Include(j => j.PlannedJobStopDetails
  .Select(jsd => jsd.PlannedTravelStop)
)
.Where(j => j.MinimumStartDate >= dateFrom && j.MaximumEndDate <= dateTo &&
       j.PlannedJobStopDetails.**All**(
         jsd => jsd.PlannedTravelStop.PlannedTravelStopStatus == status
         ));

j.PlannedJobStopDetails.Any(jsd => jsd.PlannedTravelStop.PlannedTravelStopStatus == status)返回true如果PlannedJobStopDetails中有一个PlannedTravelStopStatus匹配status

如果您只想返回所有PlannedTravelStopStatus与给定状态匹配的作业,则使用All()

Edit:仔细想想,你确定PlannedJobStopDetails实际上是EF理解的外键关系吗?