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. Спасибо за все советы в любом случае!

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