2012-09-27 55 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

我知道这听起来很奇怪,但我正在研究一种方法来解决一个问题,本身对于计算器来说太复杂了。我可能最终会以另一种方式解决它。不过谢谢。 –