Linq - Получение событий календаря, имеющих свойства Start и Length
Мое приложение имеет встроенную систему календаря, и схема базы данных для них выглядит следующим образом:
CalendarItem( CalendarItemId bigint, Start datetime, Length int, Blargh nvarchar(MAX) )
Start
значение даты и времени UTC, когда событие начинается, и Length
длина события в секундах. Событие в течение всего дня начинается в 0000h и имеет продолжительность 86400.
Я использую Linq с Entity Framework и хочу найти события, попадающие в диапазон дат. Легко найти события, которые начинаются между двумя датами, но я не знаю, как найти события, которые также заканчиваются между двумя датами.
Вот мой текущий код:
public IEnumerable<CalendarItem> GetCalendarItems(DateTime from, DateTime to) {
var events = from c in db.CalendarItems
where c.Start >= from && c.Start <= to
orderby c.Start
select c;
return events;
}
Если бы я использовал T-SQL, мне нужно было бы использовать DATEADD
добавить Length
секунд до Start
дать End
datetime, которое потом сработает, но я не думаю, что смогу сделать это в Linq. Что я могу сделать?
3 ответа
ИЗМЕНЕНО с включенной функцией ToList():
Если я читаю это правильно, вы бы хотели:
var events = (from c in db.CalendarItems
where c.Start >= from && c.Start <= to
orderby c.Start
select c).ToList();
events = events.Where(e => e.Start.AddSeconds(Length) <= to);
return events;
Это даст вам события, которые начались и закончились в течение указанного диапазона дат.
Для получения дополнительной информации о DateTime.AddSeconds(), просто перейдите по этой ссылке.
Вам нужно будет позвонить ToList()
прежде чем вы сможете использовать DateTime.AddSeconds
функция. В противном случае компилятор будет жаловаться, что не может найти AddSeconds
функция, так как ваши запросы LINQ будут переведены на SQL, а SQL не содержит этого DateTime.AddSeconds
функция.
var events = (from c in db.CalendarItems
where c.Start >= from && c.Start <= to
orderby c.Start
select c).ToList();
events = events.Where(e => e.Start.AddSeconds(Length) <= to);
return events;
РЕДАКТИРОВАТЬ: Исправил мою логику, ответ теперь идентичен с IronMan84.
Я оценил .ToList
подходы, но они неэффективны, потому что после его изменения, чтобы возвращать события, которые происходят (независимо от того, начались они или закончились в течение), период времени, он получает много несущественных результатов из базы данных.
Я также посмотрел на методы SqlFunctions, но их нет в EF1.0.
Я закончил тем, что использовал Sproc со строго типизированным импортом в моем Entity Context. Это не идеально, но это лучше, чем альтернативы.
Когда проект в конечном итоге будет обновлен до.NET4, я переключусь на SqlFunctions. Спасибо за все советы в любом случае!