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