LINQ select from join table 其中同一个外键有两个不同 ID 的记录

LINQ select from join table where the same foreign key has records for two different IDs

好的,我猜标题有点令人困惑。基本上我有那些 3 tables:

Line

id | Name
---------
1  | "A-B"
2  | "A-D"


Stop

id | Name
---------
1  | A
2  | B
3  | C
4  | D

LineStop

Id | LineId | StopId | Order
----------------------------
1  | 1      | 1      | 0
2  | 1      | 2      | 1
3  | 2      | 1      | 0
4  | 2      | 2      | 1
5  | 2      | 3      | 3
4  | 2      | 4      | 4

所以这是我个人改进的某种公共汽车票务系统。

作为输入,我得到出发 StopId (Stop.Id) 和到达 StopId (Stop.Id)。我想 select 所有路线中有这两个站点的线路(这意味着在 LineSop table 中对于相同的 LineId 我将同时记录出发站和到达站,最终我还想考虑 Order 列,该列说明公交车经过这些站的顺序,因为即使线路有我感兴趣的两个站,如果它们是倒序我还是不感兴趣。

我知道展示我到目前为止所做的事情是非常可取的,但我在 where 条件下苦苦挣扎,这似乎是这里的关键因素。出于某种原因,我决定加入 LineLineStop:

var lines = _context.Lines.Join(
            _context.LineStop,
            line => line.Id,
            lineStop => lineStop.LineId,
            (line, lineStop) => lineStop)

但是..我需要检查是否有相同的 LineId 我在 LineStop table 中有开始和结束 StopId 的记录,最终当我发现这样的记录开始 StopId Order i 少于结束 StopId Order.

希望对您有所帮助:

首先我从旅行者那里得到行程:"I want go from Stop: 2 to Stop:4"。 一旦我知道有两个停靠点的线,我就建立停靠点及其顺序。

var lines = new List<Line>() 
{ 
    new Line() { Id = 1, Name = "A-B" },
    new Line() { Id = 2, Name = "A-D" }
}; 

var stops = new List<Stop>() {
    new Stop() { Id = 1, Name = "A" },
    new Stop() { Id = 2, Name = "B" },
    new Stop() { Id = 3, Name = "C" },
    new Stop() { Id = 4, Name = "D" }
};

var lineStops = new List<LineStop>() 
{
    new LineStop() { Id = 1, LineId = 1, StopId = 1, Order = 0 },
    new LineStop() { Id = 2, LineId = 1, StopId = 2, Order = 1 },
    new LineStop() { Id = 3, LineId = 2, StopId = 1, Order = 0 },
    new LineStop() { Id = 4, LineId = 2, StopId = 2, Order = 1 },
    new LineStop() { Id = 5, LineId = 2, StopId = 3, Order = 3 },
    new LineStop() { Id = 4, LineId = 2, StopId = 4, Order = 4 },
};  

var result =  (from trip in (from l  in lines
              join d in lineStops on l.Id equals d.LineId
              join a in lineStops on l.Id equals a.LineId
              where d.StopId == 2 && a.StopId == 4
              select new { d.LineId })
              join l in lines on trip.LineId equals l.Id
              join ls in lineStops on l.Id equals ls.LineId
              select new { l.Name, ls.StopId, ls.Order }).OrderBy(x => x.Order);

预期结果

Name StopId Order
A-D       1    0
A-D       2    1
A-D       3    3
A-D       4    4