編輯 它看起來像創建一個表格,以分鐘爲單位保存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()是一個選項,但沒有長版本的Range。我在想我在這裏唯一的選擇是Aggregate,但我仍然不是那麼強大。
最後,一旦我有這個查詢工作,我想要返回那些在時間窗口內,即在不同的開始日期和結束日期之間的值。這很容易使用SkipWhile/TakeWhile。
以下是我能做到這一點,如果DateTime.Ticks是一個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) };
我想我需要的是長程的實現,就可以執行了一個EF查詢。
這似乎更適合於每日/每小時的基礎上,而不是每滴答返回日期。你如何使用這個? – Magnus 2012-01-31 17:53:23
我認爲,即使你能得到你想要的東西,你也會回過頭去問如何提高它的性能。當第一步很容易,第二步很難,這可能意味着第一步走在錯誤的道路上。 – 2012-01-31 17:58:21
你應該考慮使用一個現有的Recurrence庫,例如[Quartz.NET](http://quartznet.sourceforge.net/)或[iCalendar](http://sourceforge.net/projects/dday-ical/) – Magnus 2012-01-31 18:00:44