Linq2Entities 查询以查找给定最大混合范围的记录
Linq2Entities query to find records given mix-max range
我有这两个实体:
public class Ticket
{
public int Id { get; set; }
public int ScheduleId { get; set; }
public int SeatId { get; set; }
[DataType(DataType.Date)]
[Column(TypeName = "Date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ForDate { get; set; }
public Seat Seat { get; set; }
public Schedule Schedule { get; set; }
public ICollection<TicketStop> TicketStops { get; set; }
}
public class TicketStop
{
public int Id { get; set; }
public int TicketId { get; set; }
public int LineStopStationId { get; set; }
public Ticket Ticket { get; set; }
public LineStopStation LineStopStation { get; set; }
}
public class LineStopStation
{
public int Id { get; set; }
public int LineId { get; set; }
public int StopId { get; set; }
public int Order { get; set; }
public bool IsLastStop { get; set; }
public Line Line { get; set; }
public Stop Stop { get; set; }
}
业务案例是我正在实现一个公交车票预订系统(主要用于学习目的),我想找到重叠的车票。
LineId
+ ScheduleId
+ ForDate
的组合唯一标识一张车票是特定日期和出发时间的特定巴士。
我遇到的问题是,在给定起点和终点位置的情况下,确定两张票是否在一个或多个站点重叠。
LineStopStation
实体保存有关 StopId
和 Order
的信息,在公共汽车行程中访问了它。所以基本上,重叠的车票在某些时候会有相同的 Order
号码(除非是最后一站,这意味着乘客正在下车)。
所以我有 LineId
、ScheduleId
、StartId
和 EndId
,其中 starId 和 endId 对应于 LineStopStation.StopId
所以最终我能够像这样从他们那里得到命令。
int startStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == startId).Order;
int endStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == endId).Order;
所以我非常相信,如果在 TicketStop
table 中我有与相关数据重叠的票证,我应该能够找到所有这些信息。 TicketStop
以这种方式工作 - 如果有人买了 3 站的票,我将在那里有三个记录,它们具有相同的 TicketId
和三个不同的 LineStopStationId
.
我觉得这个问题比需要的要大。所以基本上我有这个:
public List<Seat> GetAvailableSeats(int lineId, int scheduleId, int startId, int endId, DateTime forDate)
{
int startStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == startId).Order;
int endStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == endId).Order;
var reservedSeats = _context.TicketStops
.Where(t => t.Ticket.ScheduleId == scheduleId)
.Where(t => t.Ticket.ForDate == forDate)
//basically I don't know how to proceed here.
//In pseudo code it should be something like:
.Where(t => t.Min(Order) >= endStationOrder || t.Max(Order) <= startStationOrder
}
但是观察。这不是 LINQ
的工作方式。那么我怎样才能找到这个范围重叠的所有门票?
如果不对您的模型进行 in-depth 分析,也许这样的事情可以给您一个想法?
var reservedSeats = _context.TicketStops
.GroupBy(t => new { t.Ticket.ScheduleId, t.Ticket.ForDate })
.Where(tg => tg.Key == new { ScheduleId = scheduleId, ForDate = forDate })
.Where(tg => tg.Min(t => t.LineStopStation.Order) >= endStationOrder || tg.Max(t => t.LineStopStation.Order) <= startStationOrder);
你也可以先过滤然后做空 GroupBy
:
var reservedSeats = _context.TicketStops
.Where(t => t.Ticket.ScheduleId == scheduleId && t.Ticket.ForDate == forDate)
.GroupBy(t => 1)
.Where(tg => tg.Min(t => t.LineStopStation.Order) >= endStationOrder || tg.Max(t => t.LineStopStation.Order) <= startStationOrder);
对于return所有的SeatId
,你只需要select他们从群里。
var reservedSeats = _context.TicketStops
.Where(t => t.Ticket.ScheduleId == scheduleId && t.Ticket.ForDate == forDate)
.GroupBy(t => 1)
.Where(tg => tg.Min(t => t.LineStopStation.Order) >= endStationOrder || tg.Max(t => t.LineStopStation.Order) <= startStationOrder);
.SelectMany(tg => tg.Select(t => t.Ticket.SeatId));
我有这两个实体:
public class Ticket
{
public int Id { get; set; }
public int ScheduleId { get; set; }
public int SeatId { get; set; }
[DataType(DataType.Date)]
[Column(TypeName = "Date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ForDate { get; set; }
public Seat Seat { get; set; }
public Schedule Schedule { get; set; }
public ICollection<TicketStop> TicketStops { get; set; }
}
public class TicketStop
{
public int Id { get; set; }
public int TicketId { get; set; }
public int LineStopStationId { get; set; }
public Ticket Ticket { get; set; }
public LineStopStation LineStopStation { get; set; }
}
public class LineStopStation
{
public int Id { get; set; }
public int LineId { get; set; }
public int StopId { get; set; }
public int Order { get; set; }
public bool IsLastStop { get; set; }
public Line Line { get; set; }
public Stop Stop { get; set; }
}
业务案例是我正在实现一个公交车票预订系统(主要用于学习目的),我想找到重叠的车票。
LineId
+ ScheduleId
+ ForDate
的组合唯一标识一张车票是特定日期和出发时间的特定巴士。
我遇到的问题是,在给定起点和终点位置的情况下,确定两张票是否在一个或多个站点重叠。
LineStopStation
实体保存有关 StopId
和 Order
的信息,在公共汽车行程中访问了它。所以基本上,重叠的车票在某些时候会有相同的 Order
号码(除非是最后一站,这意味着乘客正在下车)。
所以我有 LineId
、ScheduleId
、StartId
和 EndId
,其中 starId 和 endId 对应于 LineStopStation.StopId
所以最终我能够像这样从他们那里得到命令。
int startStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == startId).Order;
int endStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == endId).Order;
所以我非常相信,如果在 TicketStop
table 中我有与相关数据重叠的票证,我应该能够找到所有这些信息。 TicketStop
以这种方式工作 - 如果有人买了 3 站的票,我将在那里有三个记录,它们具有相同的 TicketId
和三个不同的 LineStopStationId
.
我觉得这个问题比需要的要大。所以基本上我有这个:
public List<Seat> GetAvailableSeats(int lineId, int scheduleId, int startId, int endId, DateTime forDate)
{
int startStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == startId).Order;
int endStationOrder = _context.LineStopStations
.First(l => l.LineId == lineId && l.StopId == endId).Order;
var reservedSeats = _context.TicketStops
.Where(t => t.Ticket.ScheduleId == scheduleId)
.Where(t => t.Ticket.ForDate == forDate)
//basically I don't know how to proceed here.
//In pseudo code it should be something like:
.Where(t => t.Min(Order) >= endStationOrder || t.Max(Order) <= startStationOrder
}
但是观察。这不是 LINQ
的工作方式。那么我怎样才能找到这个范围重叠的所有门票?
如果不对您的模型进行 in-depth 分析,也许这样的事情可以给您一个想法?
var reservedSeats = _context.TicketStops
.GroupBy(t => new { t.Ticket.ScheduleId, t.Ticket.ForDate })
.Where(tg => tg.Key == new { ScheduleId = scheduleId, ForDate = forDate })
.Where(tg => tg.Min(t => t.LineStopStation.Order) >= endStationOrder || tg.Max(t => t.LineStopStation.Order) <= startStationOrder);
你也可以先过滤然后做空 GroupBy
:
var reservedSeats = _context.TicketStops
.Where(t => t.Ticket.ScheduleId == scheduleId && t.Ticket.ForDate == forDate)
.GroupBy(t => 1)
.Where(tg => tg.Min(t => t.LineStopStation.Order) >= endStationOrder || tg.Max(t => t.LineStopStation.Order) <= startStationOrder);
对于return所有的SeatId
,你只需要select他们从群里。
var reservedSeats = _context.TicketStops
.Where(t => t.Ticket.ScheduleId == scheduleId && t.Ticket.ForDate == forDate)
.GroupBy(t => 1)
.Where(tg => tg.Min(t => t.LineStopStation.Order) >= endStationOrder || tg.Max(t => t.LineStopStation.Order) <= startStationOrder);
.SelectMany(tg => tg.Select(t => t.Ticket.SeatId));