Linq 问题,联接两个表和一个集合
本文关键字:一个 集合 两个 问题 Linq | 更新日期: 2023-09-27 17:57:02
好吧,我可能需要一些帮助,因为我真的很讨厌linq!
此集合包含给定日期的 x 个时隙 DTO。
List<TimeslotDto> timeSlots = new List<TimeslotDto>();
TimeslotDto 包含一个 DateTime SlotStart 属性和一个布尔值 IsReserved。这个集合有效,它包含我想要的时隙数。好。
现在谈谈我的问题。我想在 linq 查询中使用此集合。我有两个表,"员工"和"时隙"(实际上是三个,但如果我得到帮助,我也许可以自己将最后一个表添加到查询中)
"时间段"表包含:
- 员工ID(FK)
- 时隙ID(PK)
- 插槽启动
- ActivityId(FK 第三个表)。
"员工"表包含:
- 员工ID(PK)
- 时隙的导航属性
基于此...我想产生一个结果,即每个工作人员都有一个时隙列表,对于集合中在时隙表中具有相同日期的那些槽,IsReserved prop 应设置为 true。
因此,时间段集合包含任何给定日期的所有可能时间段。"时间段"表包含预留。我想对收藏进行 x 检查以查找每个工作人员的预订。
提前感谢!
如果有人有一个非常好的关于掌握linq的教程,请分享一下。
您可以使用 Contains
语句来实现此目的:
var query = timeSlots.Where(sl => TimeSlots.Where(t => t.StaffId == staffId)
.Select(t => t.SlotStart)
.Contains(sl.SlotStart));
如果timeSlots
仅包含该特定员工的时间段,则(稍微)具有更好的可扩展性。
在查询语法中,这看起来像
var query = from sl in timeSlots
where (from t in TimeSlots
where t.StaffId == staffId
select(t => t.SlotStart))
.Contains(sl.SlotStart);
另一种选择是将TimeSlots
放入内存中并与 timeSlots
联接。(不能使用 LINQ 将本地集合联接到 SQL 后端。
from sl in timeSlots
join t in TimeSlots.Where(x => x.StaffId == staffId)
.AsEnumerable() // Switch to memory
on ts.SlotStart equals t.SlotStart
再次假设timeSlots
是每个员工。