左外连接,急切加载

时间:2013-12-23 11:06:50

标签: linq entity-framework c#-4.0 left-join extension-methods

我正在编写一个linq,左外连接条件在右侧表格中。 我的代码

 var leftHotelRooms = db.HotelRooms.Include(hr=>hr.HotelRoomBlackoutPeriods)
                    .Where(room => hotelCodes.Contains(room.UserHotelId) &&
                      room.Scope == scope &&
                      room.IsDeleted == false &&
                      room.IsEnabled == true &&
                      room.MaxCapacity >= minimumNumberOfGuests)
                    .GroupJoin(db.HotelRoomBlackoutPeriods,
                              room => room.Id,
                              blackoutPeriod => blackoutPeriod.HotelRoomId,
                              (room, blackoutPeriod) => new
                              {
                                 room,
                                 blackoutPeriods = blackoutPeriod.DefaultIfEmpty()
                               })
                    .Select(a => new {a.room,a.blackoutPeriods})
                    .Where(
                           x => x.blackoutPeriods.Any(y => DbFunctions.DiffDays(y.StartDate, checkIn) != 0
                    &&    (DbFunctions.DiffDays(y.StartDate, checkIn) < 0) ? (DbFunctions.DiffDays(y.StartDate, checkOut) >= 0 ? false : true) : true &&
                        (DbFunctions.DiffDays(y.StartDate, checkIn) > 0) ?  (DbFunctions.DiffDays(y.EndDate, checkIn) <= 0 ? false : true) : true
                    ))
                    .ToList();
                }

效果非常好,但不急于加载,当我将上述查询的结果转换为我的商业模式时,它再次触发db.HotelRoomBlackoutPeriods上的一些查询

请提供实现此目的的最佳方式 提前致谢。
抱歉(如果我要问一些废话)提前

1 个答案:

答案 0 :(得分:1)

更改结果集的形状时,急切加载不起作用。结果集的形状为HotelRoom类型。使用任何手动连接或投影后,您将更改结果集并忽略预先加载请求。