我有一个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.....
请帮忙。
答案 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
}
);