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 条件下苦苦挣扎,这似乎是这里的关键因素。出于某种原因,我决定加入 Line
和 LineStop
:
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
好的,我猜标题有点令人困惑。基本上我有那些 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 条件下苦苦挣扎,这似乎是这里的关键因素。出于某种原因,我决定加入 Line
和 LineStop
:
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