如何使用Linq从父集合中的每个父实体中过滤子集合

时间:2013-03-15 05:09:45

标签: linq dbcontext

使用linq(EF dbcontext),我需要一个语句来过滤强类型的IEnumerable父实体集合中每个父实体的子实体集合。

例:
我有4家酒店,每家酒店全年都有几个房间预订。 但是在6月份,一(1)家酒店没有任何预订(reservation.Count = 0),但其他三家酒店各有几个预订。

问题:
尝试#1:IEnumerable(hotel) HotelList = (from hotels in context.Hotels select hotels).ToList();

没有'where'子句(过滤器)我得到IEnumerable(酒店)4个酒店和IEnumerable(预订)的ListList集合数据库中所有预订的ReservationList集合(我只想要那些6月份)!

尝试#2:IEnumerable(reservation) ReservationList = (from reservations in context.Reservations where reservations.reservation_date_month == 'June' select reservations).ToList();

如果我仅在6月过滤预订日期,我的酒店数量为3而不是4。

问题:
我需要一个linq声明,选择“父”酒店集合并过滤“儿童”预订集合,仅包括6月份的预订(记住6月份有一家酒店没有预订)。

预期结果:
结果应该是父IEnumerable(酒店)HotelList集合(包括所有4家酒店实体)和子IEnumerable(预订)ReservationList集合,列出每个酒店实体6月份的所有预订,但一(1)家酒店将有预订.Count = 0(即没有预留实体)。

谢谢 - jd

2 个答案:

答案 0 :(得分:2)

您应该自己指定join

from h in context.Hotels
join r in context_Reservations on r.hotel_id equals h.id
where reservations.reservation_date_month == 'June'
group new { h, r } by h into g
select new { Hotel g.Key, Reservations = g.Select(i => i.r).ToList() }

答案 1 :(得分:1)

我怀疑你有一个结构,每个预订都引用它所属的酒店。然后,您需要的是外部联接,它将酒店与其预订联系起来。使用外部联接而不是内部联接可确保没有匹配预留的酒店也将出现在输出中。有关详情,请参阅hereherehere