C#Linq查询获取日期范围的连续数据,尽管db中没有数据

时间:2013-04-09 21:53:52

标签: c# linq

我有一个db表,其中包含基于日期的数据

Date          sales
09/01/2012    20
09/04/2012    40

我需要获取20天的数据,如下所示,获取当年的数据以及所显示的所有缺失日期。

Date         Day      Sales
09/01/2012   Mon      20
09/02/2012   Tue      0
09/03/2012   Wed      0
09/04/2012   Thu      40
09/05/2012   Fri      0.....

请帮忙。

2 个答案:

答案 0 :(得分:1)

如果您有一个包含所有日期的Dates表,那么您可以将其用作源,然后对您的分组事务查询进行左连接。这在SQL中比在LINQ中更容易,因此存储过程可能是一种方法而不是进行LINQ查询。

但是如果你想在代码中完成所有操作,看起来除了“零”天之外你已经有了分组数据,所以把它放到代码中很容易 - 定义一个20键值的集合 - 代表20个日期的对(又名Dictionary),然后获取您的数据并将其推送到该集合中。

// Very rough - double check the date logic:
var valuesByDate = new Dictionary<DateTime, int>();
for (DateTime dt = startDate; dt < startDate.AddDays(20); dt = dt.AddDays(1)) {
    valuesByDate[dt] = 0;
}

foreach (var record in recordsFromDb) {
    valuesByDate[record.Date] = record.Sales;
}

答案 1 :(得分:0)

使用Enumerable.Range获取日期范围并进行左连接可以让您前进:

DateTime start = new DateTime(2012,09,01);
DateTime end = new DateTime(2012,09,05);

var query = Enumerable.Range(0,(end-start).Days+1)  // range of ints 
        .Select(i => start.AddDays(i))              // range of dates
        .GroupJoin(data,
            d=>d,
            d=>d.Date,
            (d,g)=>new { Date = d, 
                         Day = d.ToString("dddd"), 
                         Sales = g.Any() ? g.Sum(i=>i.Sales) : 0 
                       }
            );