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的教程,请分享一下。

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是每个员工。