Linq / Entity Framework - 如何按范围按日期分组

时间:2015-08-02 00:56:08

标签: c# linq entity-framework

我有一张"案例"以下数据:

ID |  OpenDate  |  CloseDate
-----------------------------
1  | 2015-01-01 | 2015-01-02
2  | 2015-01-02 | 2015-01-03
3  | 2015-01-03 | 2015-01-03

我想为指定的日期范围创建一个linq查询,以查看为指定范围内的每个日期打开的案例数,以便我可以创建打开案例的时间轴图。一个案例在其OpenDate,CloseDate和其间的所有日期被视为开放。例如,如果一个案例在1月1日开放并在1月3日关闭,则将在1月1日,2日和3日计算。

如果我查询的日期范围是2015-01-01到2015-01-04,我希望退出查询的结果示例。

Date       |  Count
--------------------
2015-01-01 | 1
2015-01-02 | 2
2015-01-03 | 2
2015-01-04 | 0

我似乎无法在报告的日期范围内对每个日期执行linq查询,从而找到一种简单的方法(例如,60天的范围将需要对数据库进行60次查询)。是否有一个使用EF从一个查询中获取这些结果的简单解决方案?

修改 修正了一个计数拼写错误。此外,作为澄清,案件被认为是在截止日期结束前开放的。例如,ID 2应该计入1月2日和3日。

2 个答案:

答案 0 :(得分:1)

也许试试这个。首先生成您感兴趣的本地日期序列:

var startDate = new DateTime(2015,1,1);
var dates = Enumerable.Range(0,300).Select(offset => startDate.AddDays(offset));

然后,试试这个(dcx是您的数据上下文,CaseRanges对应您的第一个表格):

var query = from dte in dates
            from row in dcx.CaseRanges
            where dte >= row.OpenDate && dte <= row.CloseDate
            group dte by dte into grp
            select new {Date=grp.Key, Count=grp.Count()};

答案 1 :(得分:-1)

使用foreach循环并将开始日期和结束日期添加到新列表中,以便新列表中包含6个项目,然后在该新列表上执行GroupBy。