2013-01-07 61 views
0

我的應用程序有一個內置的日曆系統,併爲他們的數據庫架構是這樣的:LINQ的 - 開始有開始和長度屬性日曆事件

CalendarItem(CalendarItemId bigint, Start datetime, Length int, Blargh nvarchar(MAX)) 

Start是UTC日期時間價值的情況下啓動時,並且Length是以秒爲單位的事件的長度。全天活動開始於0000h,長度爲86400.

我正在使用Linq與實體框架,我想查找日期範圍內的事件。很容易找到在兩個日期時間之間開始的事件,但我不知道如何在兩個日期時間之間找到也是結束的事件。

這裏是我當前的代碼:

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,我需要使用DATEADDLength秒添加到Start給一個End日期時間,那麼這將工作,但我不我認爲我可以在Linq做到這一點。我能做什麼?

+1

請參閱http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.dateadd.aspx –

回答

1

您需要先致電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的。

+0

您的events.Where子句將始終返回所有內容。 e.Start總是小於e.Start.AddSeconds(長度)。請參閱我的答案以獲得更好的解決方案。 – IronMan84

+0

@ IronMan84謝謝你是對的。感謝您將我的答案合併爲一個答案。 – rexcfnghk

2

與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()的更多信息,請訪問this link

0

我評估了.ToList方法,但效率不高,因爲在修改它以返回發生的事件(無論它們是否在某個時間段內開始或結束)之後,它會從數據庫中獲取許多不相關的結果。

我也看了一下SqlFunctions的方法,但它們不在EF1.0中。

我最終在我的實體上下文中使用了強類型導入的Sproc。這不是完美的,但它比替代品更好。

當項目最終升級到.NET4時,我將切換到SqlFunctions。無論如何感謝所有的建議!