C# MroomStatus=x.Move.Status, RoomtypeUsage=mr.Roomtype.Usage, BookingReference=x.Mgroup.ReferenceNumber, Guest=x.Guest } ); }
并将其用作:C# MroomStatus=x.Move.Status, RoomtypeUsage=mr.Roomtype.Usage, BookingReference=x.Mgroup.ReferenceNumber, Guest=x.Guest } ); },c#,performance,entity-framework,linq,C#,Performance,Entity Framework,Linq,并将其用作: GetDefaultQuery(ctx, q => !q.RoomHidden && q.From <= dtLoadEnd && dtLoadStart <= q.Until); GetDefaultQuery(ctx,q=>!q.RoomHidden&&q.来自连接使用了大量内存并减慢了查询速度。您可以通过在连接之前添加where来加快查询速度,如下所示:在m.MgroupId.where上的CustomerCtx.mgrou
GetDefaultQuery(ctx, q => !q.RoomHidden && q.From <= dtLoadEnd && dtLoadStart <= q.Until);
GetDefaultQuery(ctx,q=>!q.RoomHidden&&q.来自连接使用了大量内存并减慢了查询速度。您可以通过在连接之前添加where来加快查询速度,如下所示:在m.MgroupId.where上的CustomerCtx.mgroup中加入mg(x=>Math.Abs(x.Status)!=(int)IResStatus.complete)等于mg.mgroupid您在Mrooms
上没有导航属性,允许您选择mr.Status.Flags
,而不是使用显式联接吗?
Query = GetDefaultQuery.Where(q => !q.RoomHidden && q.From <= dtLoadEnd && dtLoadStart <= q.Until);
Query = Query.Where(q => q.RoomtypeUsage == RoomtypeUsageType.Roomplan);
public static IQueryable<MroomLinqModel> GetDefaultQuery(CustomerContext CustomerCtx, bool? roomHidden, DateTime? dtLoadEnd
/* you can add more parameters but for demonstrations purposes i'm only describing this 2*/)
{
var query = CustomerCtx.Mrooms;
if(roomHidden.HasValue)
{
query = query.Where( q=>q.From == roomHidden.Value)
}
if(dtLoadEnd .HasValue)
{
query = query.Where( q=>q.RoomHidden <= dtLoadEnd.Value)
}
// you can add more conditions
var Mrooms = (from query
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;
}
public class Mroom {
public int MroomId {get; set;}
[ForeignKey("Move")]
public int MoveId {get; set;} //FK
public virtual Move Move {get; set;} //Navigation property
//configuration may be needed cf annotation
[ForeignKey("Status")]
public int StatusId {get; set;}
public virtual Status Status {get; set;}
//... Mgroup, Guest, ...
}
public static IQueryable<MroomLinqModel> GetDefaultQuery(CustomerContext CustomerCtx, Expression<Function<Mroom, bool>> q)
{
Expression<Function<Mroom, bool>> w = PredicateBuilder.New<Mroom>
(s => Math.Abs(s.Mgroup.Status) != (int)IResStatus.InComplete &&
s.Visible);
w = w.And(q);
return
CustomerCtx.Mrooms.
Where(w.Expand()).
Select( x => new MroomLinqModel
{
OpenDepositPayments = x.Mgroup.DepositPayments.Any(dp => !dp.Paid),
RoomHidden = (x.RoomId == null ? true : x.Room.Hidden),
StatusVisible = x.Status.Visible,
MroomId = x.MroomId,
MoveId = x.MoveId,
MgroupId = x.MgroupId,
StatusId = x.Status.StatusId,
StatusFlags = x.Status.Flags,
BackgroundColor = x.Status.Background_Argb,
TextColor = x.Status.Foreground_Argb,
PersonCount = x.Move.Movegroups.Sum(m => m.PersonCount),
MoveCount = x.Mgroup.Moves.Count(),
RoomId = x.RoomId,
PMSMroomId = x.PMS_Id,
PMSMoveId = x.Move.PMS_Id,
PMSMgroupId = x.Mgroup.MgroupId_Casablanca,
From = x.From,
Until = x.Until,
EditableState = x.Move.EditableState,
MroomStatus = x.Move.Status,
RoomtypeUsage = mr.Roomtype.Usage,
BookingReference = x.Mgroup.ReferenceNumber,
Guest = x.Guest
}
);
}
GetDefaultQuery(ctx, q => !q.RoomHidden && q.From <= dtLoadEnd && dtLoadStart <= q.Until);
Expression<Function<Mroom, bool>> w = PredicateBuilder.New<Mroom>(q =>
!q.RoomHidden && q.From <= dtLoadEnd && dtLoadStart <= q.Until);
//some logic
w = w.And(q => q.RoomtypeUsage == RoomtypeUsageType.Roomplan);
GetDefaultQuery(ctx, w);