【发布时间】:2019-08-02 23:13:48
【问题描述】:
我有一个带有 5 个连接/表的 Linq 查询,具有预定义的条件。 因为我需要多次查询,所以我创建了一个函数,该函数将默认 LINQ 查询作为 IQueryable 返回。
public static IQueryable<MroomLinqModel> GetDefaultQuery(CustomerContext CustomerCtx)
{
var Mrooms = (from mr in CustomerCtx.Mrooms
join m in CustomerCtx.Moves on mr.MoveId equals m.MoveId
join mg in CustomerCtx.mgroup on m.MgroupId equals mg.MgroupId
join s in CustomerCtx.Status on m.StatusId equals s.StatusId
join rt in CustomerCtx.Roomtypes on mr.RoomtypeId equals rt.Key
join g in CustomerCtx.Guests on m.Mgroup.GuestId equals g.GuestId
where
Math.Abs(mg.Status) != (int)IResStatus.InComplete &&
s.Visible
select new MroomLinqModel
{
OpenDepositPayments = mg.DepositPayments.Any(dp => !dp.Paid),
RoomHidden = (mr.RoomId == null ? true : mr.Room.Hidden),
StatusVisible = s.Visible,
MroomId = mr.MroomId,
MoveId = m.MoveId,
MgroupId = mg.MgroupId,
StatusId = s.StatusId,
StatusFlags = s.Flags,
BackgroundColor = s.Background_Argb,
TextColor = s.Foreground_Argb,
PersonCount = m.Movegroups.Sum(m => m.PersonCount),
MoveCount = mg.Moves.Count(),
RoomId = mr.RoomId,
PMSMroomId = mr.PMS_Id,
PMSMoveId = m.PMS_Id,
PMSMgroupId = mg.MgroupId_Casablanca,
From = mr.From,
Until = mr.Until,
EditableState = m.EditableState,
MroomStatus = mr.Status,
RoomtypeUsage = mr.Roomtype.Usage,
BookingReference = mg.ReferenceNumber,
Guest = g
});
return Mrooms;
}
现在我想在之后添加一些条件,例如:
Query = GetDefaultQuery.Where(q => !q.RoomHidden && q.From <= dtLoadEnd && dtLoadStart <= q.Until);
Query = Query.Where(q => q.RoomtypeUsage == RoomtypeUsageType.Roomplan);
这很好用,但执行起来需要更多时间,就像我将所有条件直接添加到第一个 LINQ 查询一样。
如何形成查询以访问原始表并生成快速查询?
【问题讨论】:
-
连接使用大量内存并减慢查询速度。您可以通过在连接之前添加 where 来加快查询速度:在 m.MgroupId.Where(x => Math.Abs(x.Status) != (int)IResStatus.InComplete) 上的 CustomerCtx.mgroup 中加入 mg 等于mg.MgroupId
-
您在
Mrooms上没有导航属性,允许您选择mr.Status.Flags而不是使用显式连接?
标签: c# performance entity-framework linq