LINQ выбрать из таблицы соединений, где один и тот же внешний ключ имеет записи для двух разных идентификаторов - PullRequest
0 голосов
/ 13 июня 2019

Хорошо, так что название немного сбивает с толку, я думаю. В основном у меня есть эти 3 таблицы:

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). Я хочу выбрать все линии, которые имеют эти две остановки на своих маршрутах (это будет означать, что в таблице LineSop для одной и той же LineId у меня будут записи с остановками отправления и прибытия, в конечном итоге я также хотел бы рассмотреть столбец Order, в котором указывается, в каком порядке шина проходит эти остановки, потому что даже если линия имеет две остановки, которые меня интересуют, если они находятся в обратном порядке, мне все равно не интересно.

Я знаю, что очень желательно показать, что я сделал до сих пор, но я борюсь с условиями «где», которые, кажется, являются здесь ключевым фактором. По какой-то причине я решил присоединиться к Line с LineStop:

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

Но тогда .. Мне нужно проверить, есть ли для той же LineId записи в таблице LineStop с начальным и конечным значениями StopId и, в конечном итоге, когда я нашел такие записи, начальный StopId Порядок меньше чем конец StopId Заказ.

1 Ответ

0 голосов
/ 13 июня 2019

Я надеюсь, что это поможет вам:

Сначала я получаю поездку от путешественника: «Я хочу перейти от остановки: 2 к остановке: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...