Как я могу упростить этот запрос LINQ-To-Entity и сделать его динамичным - PullRequest
1 голос
/ 04 декабря 2010

У меня есть этот запрос для получения данных через Entity Framework, который работает сегодня.Дело в том, что я хочу создать запрос динамически, то есть построить его в блоках, но я не могу понять, как именно это сделать.Я верю, что если я смогу каким-то образом сохранить одно из значений, которые я получаю вначале, я смогу это сделать, но теперь я получаю его дважды (возможно, немного медленнее? Если только компилятор не исправит это до запроса).Имеет смысл?Вот LINQ:

from d in db.trains
where d.cancelled
&& d.station == toStation
&& d.date >= fromDate.Date
&& d.date <= toDate.Date
&& (from k in db.trains
    where 
    k.date == d.date
    && k.trainId == d.trainId
    && k.stationId == fromStation
    && k.position <= d.position
    select k.trainId).Contains(d.trainId)
select new
{
  trainId = d.trainId,
  date = d.date,
  arrival = d.arrival,
  departure = (from k in db.trains
               where
               k.date == d.date
               && k.trainId == d.trainId
               && k.stationId == fromStation
               && k.position <= d.position
               select k.departure).FirstOrDefault()
}
);

Итак, вы видите, чтобы получить отправление, мне нужно снова получить ту же вещь.Так что я спрашиваю, могу ли я сохранить объект в первом запросе, а затем каким-то образом получить его позже?Я не могу заставить работать синтаксис.

База данных выглядит примерно так:

trainId stationId date       arrival departure position

1       99        2010-10-11 10:00   10:10     1
1       98        2010-10-11 11:20   11:30     2
1       47        2010-10-11 12:30   12:40     3
2       99        2010-10-10 15:00   15:10     5

и т. Д.

Итак, мне нужно извлечь два объекта из БД, где первый имеет stationId x идругой имеет stationId y, и оба имеют одинаковую дату и trainId, и они должны быть в правильном порядке, в зависимости от положения (поезда идут в обоих направлениях, но с разными trainId).

Кроме того, я быхотелось бы иметь возможность строить этот запрос динамически, например так:

var trains = from d in db.trains
             select d;

if (id > 0)
  trains = trains.Where(p => p.trainId == id);

if (date != DateTime.MinValue)
  trains = trains.Where(p => p.date == date);

var items = (from train in trains).ToList();

Т.е. в зависимости от того, имеют ли значения различные переменные.

1 Ответ

1 голос
/ 04 декабря 2010

Вы можете использовать оператор let, чтобы хранить локальные переменные и использовать их позже
Как то так:

from d in db.trains
where d.cancelled
&& d.station == toStation
&& d.date >= fromDate.Date
&& d.date <= toDate.Date
let departures = (from k in db.trains
    where 
    k.date == d.date
    && k.trainId == d.trainId
    && k.stationId == fromStation
    && k.position <= d.position
    select k)
where departures.Select(d => d.trainId).Contains(d.trainId)
select new
{
  trainId = d.trainId,
  date = d.date,
  arrival = d.arrival,
  departure = departures.Select(d => d.departure).FirstOrDefault()
}
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...