2013-03-01 3 views
-1

У меня есть немного сложная функция диапазона дат, в которой я нуждаюсь.Запрос LINQ для диапазона дат?

В расписании есть 2 вещи ... дата начала и часы.

Дата окончания можно вычислить, выполнив:

ResolveEndDate(DateTime start, double hours) 
    { 
     int days = (int)Math.Floor(hours/GetDayHours()); 

     DateTime dt = start.AddDays(days); 
    } 

Это происходит потому, что рабочий день имеет N часов и так далее.

Исходя из этого, мне нужно найти проекты, которые:

  • Start до диапазона и в конце после
  • Start до и заканчиваться в пределах
  • Start внутри и заканчиваться в пределах
  • Start внутри и конец после

Как я могу написать запрос LINQ для этого?

Учитывая то вроде этого:

public static IEnumerable<Project> GetProjectRange(IEnumerable<Project> projects, DateTime start, DateTime end) 
     { 
      return from p in projects 
        where p.Schedule.DateFrom.Value... 
        select p; 
     } 

Другая сложная вещь только месяц день и год должны быть рассмотрены. Время не следует рассматривать.

1 запрос, который удовлетворяет всем 4 условиям.

У меня нет проблем с написанием этого запроса, но, как я бы это сделал, это был бы огромный беспорядок. Я надеюсь, что есть лучший способ делать диапазоны дат.

Thanks

+0

Вы имеете в виду любой из этих 4 критериев или запрос по каждому критерию? Не являются ли первые и четвертые критерии одинаковыми? –

+0

Извините, это была ошибка. Кроме того, 1 запрос, который удовлетворяет всем 4. – jmasterx

+2

Буду честным, это безумие. в этих условиях ... его КАЖДЫЙ проект. Нет? Вы хотите, чтобы они отсортировались по условию? –

ответ

1

что-то вроде этого?

return 
    from p in projects 
    where 
     (  p.Schedule.DateFrom.Value < start 
      && p.Schedule.DateTo.Value > end 
     ) || // 1. 
     (  p.Schedule.DateFrom.Value < start 
      && p.Schedule.DateTo.Value > start 
      && p.Schedule.DateTo.Value < end 
     ) || // 2.    
     (  p.Schedule.DateFrom.Value > start 
      && p.Schedule.DateFrom.Value < end 
      && p.Schedule.DateTo.Value > start 
      && p.Schedule.DateTo.Value < end 
     ) || // 3.   
     (  p.Schedule.DateFrom.Value > start 
      && p.Schedule.DateFrom.Value < end 
      && p.Schedule.DateTo.Value > end 
     ) // 4. 
    select p; 
+0

Это может быть сокращено до 2 чеков, так как исходные 4 случая могут быть уменьшены до 2 случаев. Я думаю, что ОП должен выяснить, как, если им любопытно – JRoughan

+0

@JRoughan Я уверен, что это может быть упрощено логически - я просто предоставлял 4 предложения, которые соответствовали его четырем случаям. –

+0

Это было именно то, что мне нужно, спасибо – jmasterx

Смежные вопросы