Диапазон запросов данных linq C#

У меня есть календарь на моем веб-сайте, и пользователи могут создавать события одного или нескольких дней.
Итак, по моему Calendar В таблице я установил два поля Start(Дата и время) и End(DateTime).

Я хочу сделать запрос с конкретным диапазоном дат, как от 08/01/2017 в 08/31/2017,
Теперь, как я могу взять все события, которые находятся в этом диапазоне?

Я должен взять:

  • События, которые начинаются в этом диапазоне и заканчиваются до или после окончания диапазона,
  • События, которые начинаются до диапазона и заканчиваются в этом диапазоне,
  • События, которые начинаются до этого диапазона, но заканчиваются после этого диапазона


Можно ли сделать один запрос, или мне нужно сделать три разных запроса?

Я надеюсь, я объяснил себе, иначе спросите меня...

3 ответа

Решение

Я бы сказал, что этого должно быть достаточно, чтобы проверить event.End >= range.Start && event.Start <= range.End

       0 1 2 3 4 5 6 7 8 9
Диапазон |-----|
Evt1   |-|                   evt.End  false
Evt2                 |-|     evt.Start > range.End => false
Evt3     |-----------|       => правда
Evt4     |-------|           => правда
Evt5             |-----|     => правда
Evt6           |-|           => правда

Ваши требования могут быть сведены к фактам, которые:

  • событие начинается до конца диапазона и
  • событие заканчивается после начала диапазона

("и" важно, иначе события, находящиеся за пределами диапазона, тоже будут совпадать).

Итак, это должно работать:

DateTime startRange = new DateTime(2017, 08, 01);
DateTime endRange   = new DateTime(2017, 08, 32);

var events = db.Events.Where(e => e.Start <= rangeEnd && e.End >= rangeStart);
DateTime startRange = new DateTime(2017, 08, 01);
DateTime endRange   = new DateTime(2017, 08, 32);

var events = db.Events
   .Where(e => e.Start >= startRange && startRange <= e.End && e.End >= endRange
            || e.Start <= startRange && e.End >= endRange
            || e.Start <= startRange && endRange >= e.Start && e.End <= endRange);

Достаточно ли этого?

Другие вопросы по тегам