2012-09-27 51 views
1

我希望創建一個LINQ查詢,這將導致包含一系列日期的結果集。我想給它2012-09-01 2012-09-05並且,它應該返回一個包含一個結果:LINQ選擇一個日期範圍加入其他查詢

  • 2012-09-01
  • 2012-08-30
  • 2012-09- 03
  • 2012年9月4日
  • 2012-09-05

我想這是因爲我希望在加入對後續查詢,可能不包含所有日期使用它。不過,我希望最終結果包含間隔中的所有日期,而不管其他任何查詢是否返回任何結果。

我使用LINQ to Entities。

作爲一個真實的例子,它可能是這個樣子:

from p in projects 
where p.StartDate > dateFrom && p.StartDate < dateTo 
// somehow 'select' every date between dateFrom and dateTo, 
// so you get one row in the resultset for each date in between. 

回答

2

要做到這一點,最簡單的方法是創建一個Dates表:

create table Dates (
Date DATE NOT NULL PRIMARY KEY 
) 

,並適當地填充它。 T-SQL沒有數組或生成器函數。

在此表上的聚集索引將使它快速選擇所有可能的日期的小分範圍。

您也可以添加更多的列像DayOfWeek TINYINT NOT NULLIsHoliday BIT NOT NULL,...非常方便。

我還要提及的可能性,以填補在應用程序代碼中缺少的日期。我認爲這取決於你的確切情況,如果這是好的或不好的。特別是如果你想要連接的結果用於進一步的服務器端處理,你可能需要一個日期表。

+0

好的有效答案。我希望不必像這樣做一張桌子。我希望更多的東西像'from [from]在某些地方where date> intervalFrom group by day select firstordefault'(這個例子是僞代碼) –

+0

您可以創建一個視圖或TVF來生成這樣的列表,使用'select從(值(1),(2),(3),...)'生成數字和日期,但這同樣令人討厭。它變得笨拙,對於日期我看不到一種方法來使其表現良好(不會生成10k可能日期的完整列表並將其過濾掉)。 – usr

+1

順便說一下,這些「生成的表格」在實踐中確實很好地工作。我甚至有[1..1M]中的所有數字。起初聽起來很討厭,但你學會喜歡它......沒有更好的辦法。 – usr

0

首先,它聽起來就像你只是想沿線的一個where條款:

where foo.Date >= startDate && foo.Date < endDate 

,你'd endDate獨家約束(例如9月6日午夜),以捕獲「9月5日期間」的任何日期/時間值。

然後,您可以組的結果按日期...我會做後期處理,.NET(在LINQ到對象)來處理它們沒有什麼結果的日期。這可能比嘗試在Entity Framework代碼中做到這一點要簡單得多。

+0

我明白這一點,但我正在尋找其他方法。我不能使用後處理來填充空日期,因爲我需要使用另一個LINQ查詢來加入LINQ查詢,並且他們需要對數據庫一起運行(同時還有第三個和第四個查詢) –

+0

但是在連接哪裏沒有一方面的結果,你不會得到任何結果,所以你可以後處理?如果你真的做不到,那麼usr的答案可能是唯一理智的答案。 –

+0

我知道這聽起來很奇怪,但我正在研究一種方法來解決一個問題,本身對於計算器來說太複雜了。我可能最終會以另一種方式解決它。不過謝謝。 –