Диапазон запросов данных 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.Endfalse 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);
Достаточно ли этого?