편집 조인 할 DateTimes를 분으로 보유하는 테이블을 만드는 것이 가장 합당합니다. 분당 100 년 가치는 ~ 52M 행입니다. Ticks에서 색인을 생성하면 쿼리가 매우 빠르게 실행됩니다. 지금은간격 및 단계를 사용하여 일정 범위의 날짜를 가져옵니다.
여러분 모두에게 감사드립니다!
public class Recurrence
{
public int Id { get; protected set; }
public DateTime StartDate { get; protected set; }
public DateTime? EndDate { get; protected set; }
public long? RecurrenceInterval { get; protected set; }
}
그것은 엔티티 프레임 워크 POCO 클래스입니다 :
나는 다음과 같습니다 재발라는 클래스가 있습니다. 이 클래스로 표준 쿼리 연산자를 사용하여 수행하고자하는 두 가지 작업이 있습니다. (쿼리가 서버 쪽에서 완전히 실행되도록).
먼저 주어진 반복 간격을 포함하여 시작 날짜부터 종료 날짜까지의 모든 날짜를 반환하는 쿼리를 만들고 싶습니다. 반복적 인 기능은
for(i=StartDate.Ticks; i<=EndDate.Ticks; i+=RecurrenceInterval)
{
yield return new DateTime(i);
}
Enumerable.Range은() 옵션이 될 것입니다 간단하지만 범위의 더 긴 버전은 없습니다. 내 유일한 옵션은 Aggregate라고 생각하지만 아직 그 기능이 그리 강하지는 않습니다.
마지막으로 쿼리가 작동하면 시간 창 내에있는 다른 시작일과 종료일 사이의 값을 반환하고 싶습니다. 그것은 SkipWhile/TakeWhile을 사용하기에 충분합니다. 여기
는 DateTime.Ticks 나는 내가 필요한 것은 EF 쿼리를 통해 실행할 수 LongRange의 구현입니다 생각하는 int
from recurrence in Recurrences
let range =
Enumerable
.Range(
(int)recurrence.StartDate.Ticks,
recurrence.EndDate.HasValue ? (int)recurrence.EndDate.Value.Ticks : (int)end.Ticks)
.Where(i=>i-(int)recurrence.StartDate.Ticks%(int)recurrence.RecurrenceLength.Value==0)
.SkipWhile(d => d < start.Ticks)
.TakeWhile(d => d <= end.Ticks)
from date in range
select new ScheduledEvent { Date = new DateTime(date) };
있다면 내가 할 수있는 방법입니다.
매일/시간 단위가 아닌 모든 틱에 대한 날짜를 반환하는 것이 더 적절한 것 같다 : – Magnus
나는 네가 원하는 것을 얻을 수 있다고하더라도, 그 성능을 향상시키는 방법을 물어볼 것이다. 첫 번째 단계가 쉽고 두 번째 단계가 어려워지면 첫 번째 단계가 잘못된 경로에 있었음을 의미 할 수 있습니다. –
[Quartz.NET] (http://quartznet.sourceforge.net/) 또는 [iCalendar] (http://sourceforge.net/projects/dday-ical/) – Magnus