C# 将where子句添加到嵌套Linq selects

C# 将where子句添加到嵌套Linq selects,c#,linq,C#,Linq,我还是Linq的新手,所以如果你看到我真的不应该做的事情,请随时提出改变的建议 我正在研究一个新的系统,允许警官注册加班。部分数据显示在地图上,搜索条件过滤不需要的位置。为了使数据更易于处理,使用Linq将其读入层次对象结构。在本例中,一个作业可以包含多个班次,每个班次可以有多个可用职位。读取它们的Linq语句如下所示 var jobs = (from j in db.Job join s in db.Shift on j.Id equal

我还是Linq的新手,所以如果你看到我真的不应该做的事情,请随时提出改变的建议

我正在研究一个新的系统,允许警官注册加班。部分数据显示在地图上,搜索条件过滤不需要的位置。为了使数据更易于处理,使用Linq将其读入层次对象结构。在本例中,一个作业可以包含多个班次,每个班次可以有多个可用职位。读取它们的Linq语句如下所示

        var jobs = (from j in db.Job
                    join s in db.Shift on j.Id equals s.JobId into shifts
                    select new JobSearchResult
                    {
                        JobNumber = j.Id,
                        Name = j.JobName,
                        Latitude = j.LocationLatitude,
                        Longitude = j.LocationLongitude,
                        Address = j.AddressLine1,
                        Shifts = (from shift in shifts
                                  join p in db.Position on shift.Id equals p.ShiftId into positions
                                  select new ShiftSearchResult
                                  {
                                      Id = shift.Id,
                                      Title = shift.ShiftTitle,
                                      StartTime = shift.StartTime,
                                      EndTime = shift.EndTime,
                                      Positions = (from position in positions
                                                   select new PositionSearchResult
                                                   {
                                                       Id = position.Id,
                                                       Status = position.Status
                                                   }).ToList()
                                  }).ToList()
                    });
这工作正常,已经过测试。也许有更好的方法,如果你知道一种方法,请随意提出建议。我的问题是这个。创建查询后,将添加搜索条件。我知道我可以在创建查询时添加它,但对于这一点,在创建查询后更容易添加。现在,我可以简单地添加如下所示的条件

jobs = jobs.Where(j => j.JobNumber == 1234);
然而,我很难想出如何在轮班或职位上做同样的事情。换言之,我怎样才能添加在特定时间之后开始轮班的条件呢?下面的例子是我试图完成的,但(显然)不起作用


有人有什么建议吗?

第1步:创建关联,以便将联接隐藏在EntitySet属性后面。

步骤2:构建过滤器。您有3个可查询项和过滤器交互的可能性。首先指定最里面的过滤器,以便外部过滤器可以使用它们

以下是所有作业(未过滤)。每个工作只有3个空缺职位的轮班。每个班次都有这些空缺职位

Expression<Func<Position, bool>> PositionFilterExpression =
  p => p.Status == "Open";

Expression<Func<Shift, bool>> ShiftFilterExpression =
  s => s.Positions.Where(PositionFilterExpression).Count == 3  

Expression<Func<Job, bool>> JobFilterExpression =
  j => true
表达式位置筛选器表达式=
p=>p.状态==“打开”;
表达式移位过滤器表达式=
s=>s.Positions.Where(PositionFilterExpression).Count==3
表达式JobFilterExpression=
j=>true
第3步:将所有内容放在一起:

   List<JobSearchResult> jobs = db.Jobs
     .Where(JobFilterExpression)
     .Select(j => new JobSearchResult
     { 
       JobNumber = j.Id, 
       Name = j.JobName, 
       Latitude = j.LocationLatitude, 
       Longitude = j.LocationLongitude, 
       Address = j.AddressLine1, 
       Shifts = j.Shifts
         .Where(ShiftFilterExpression)
         .Select(s => new ShiftSearchResult
         {
           Id = s.Id,
           Title = s.ShiftTitle,
           StartTime = s.StartTime,
           EndTime = s.EndTime,
           Positions = s.Positions
             .Where(PositionFilterExpression)
             .Select(p => new PositionSearchResult
             {
               Id = position.Id,
               Status = position.Status
             })
             .ToList() 
         })
         .ToList()
     })
     .ToList(); 
List jobs=db.jobs
.Where(作业筛选器表达式)
.选择(j=>new JobSearchResult
{ 
JobNumber=j.Id,
Name=j.JobName,
纬度=j.位置纬度,
经度=j.位置经度,
地址=j.AddressLine1,
班次=j.班次
.Where(移位过滤器表达式)
.选择(s=>new ShiftSearchResult
{
Id=s.Id,
Title=s.shiftitle,
StartTime=s.StartTime,
EndTime=s.EndTime,
位置=s.位置
.Where(位置过滤器表达式)
.选择(p=>new PositionSearchResult
{
Id=位置。Id,
状态=位置。状态
})
托利斯先生()
})
托利斯先生()
})
.ToList();

您是在尝试根据班次筛选作业,还是在尝试筛选每个作业下的班次数?可以根据许多不同的标准进行筛选。轮班何时开始,轮班多长时间,轮班是否有空缺职位,工作地点在哪里,谁是雇主,等等。。。所以有很多不同的标准。是的,一个标准甚至可能是一份工作有多少班次。请记住,一份工作可能代表一个教堂需要一名十字警卫,一直到管理超级碗的所有警官。因此,对各种搜索条件的需求都很高。我只是在尝试使用表达式路径,但在查询之后一直在尝试这样做。我想这对我有用。我会试试看,让你知道。我经常玩这个。这肯定是沿着正确的轨道。然而,我做了一些检查,发现我的方法以及上面的方法产生了大量SQL流量,所以我将重新思考我是如何做到这一点的。谢谢你的代码建议,我确实从中学到了一些东西,所以我将给出解决方案。
   List<JobSearchResult> jobs = db.Jobs
     .Where(JobFilterExpression)
     .Select(j => new JobSearchResult
     { 
       JobNumber = j.Id, 
       Name = j.JobName, 
       Latitude = j.LocationLatitude, 
       Longitude = j.LocationLongitude, 
       Address = j.AddressLine1, 
       Shifts = j.Shifts
         .Where(ShiftFilterExpression)
         .Select(s => new ShiftSearchResult
         {
           Id = s.Id,
           Title = s.ShiftTitle,
           StartTime = s.StartTime,
           EndTime = s.EndTime,
           Positions = s.Positions
             .Where(PositionFilterExpression)
             .Select(p => new PositionSearchResult
             {
               Id = position.Id,
               Status = position.Status
             })
             .ToList() 
         })
         .ToList()
     })
     .ToList();