Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用按天、月、qtr、年等分组的实体框架聚合日期数据_Entity Framework - Fatal编程技术网

Entity framework 使用按天、月、qtr、年等分组的实体框架聚合日期数据

Entity framework 使用按天、月、qtr、年等分组的实体框架聚合日期数据,entity-framework,Entity Framework,我有一张记录活动的桌子。所有活动都有一个activitydate。我想计算一段时间内(天、月、qtr等)有多少活动。我想包括所有的日期,甚至那些没有活动的日期。我可以在数据层中使用DateDimension表来实现这一点,其中date表有一个名为day的列,每个日历日包含一行,还有一个外部联接,按查询分组: 日期维度表 |第| |2013年1月1日00:00:00 | |2013年1月1日00:00:00 | |2013年1月1日00:00:00 | 查询 SELECT CAST(Day AS

我有一张记录活动的桌子。所有活动都有一个activitydate。我想计算一段时间内(天、月、qtr等)有多少活动。我想包括所有的日期,甚至那些没有活动的日期。我可以在数据层中使用DateDimension表来实现这一点,其中date表有一个名为day的列,每个日历日包含一行,还有一个外部联接,按查询分组:

日期维度表
|第|
|2013年1月1日00:00:00 |
|2013年1月1日00:00:00 |
|2013年1月1日00:00:00 |

查询

SELECT CAST(Day AS DATE), COUNT() AS CountOfActivities
FROM DateDimension dd LEFT OUTER JOIN Activities a  
    ON CAST(dd.Day AS DATE) = CAST(a.ActivityDate AS DATE)
WHERE Day BETWEEN MyStartDate AND MyEndDate
GROUP BY CAST(Day AS DATE)
ORDER BY CAST(Day AS DATE)
我使用的是EntityFramework,所以我想使用Linq执行这个查询。DateDimension表没有驻留在数据库中的业务值。它的存在只是为了通过提供一个日期列表来支持这些聚合查询,这样我就可以确保在给定日期不存在任何活动的情况下返回一行


我的想法是,我可以在内存中创建一个天数列表,并在运行时将它们编入一个更简单的数据库查询的结果中。通过连接来自2个IEnumerables的结果—1个来自内存中的日期表,另一个来自数据库结果。我怎么能这么做?我应该这样做吗?

像这样的事情怎么样:

日期范围示例:

var from = DateTime.Today.AddDays(-30);
var to = DateTime.Today;
用于记录每天活动的字典:

var activityCounts = new Dictionary<DateTime, int>();
加上范围内每天的实际活动计数:

context.Activities.Where(a => a.DateTime >= from && a.DateTime <= to)
    .GroupBy(a => a.DateTime)
    .ToList()
    .ForEach(x => activityCounts[x.Key] = x.Count()); 
context.Activities.Where(a=>a.DateTime>=from&&a.DateTime a.DateTime)
托利斯先生()
.ForEach(x=>activityCounts[x.Key]=x.Count());
通过这种方式,您只需点击数据库,就可以聚合日期为活动的活动。然后在应用服务器上对日期范围内连续日期的结果集进行填充

只需要注意你的日期是如何存储在数据库中的。此代码示例希望能够根据对DateTime.Today的调用的格式匹配活动字典中的键。您需要在数据库查询中相应地设置日期

context.Activities.Where(a => a.DateTime >= from && a.DateTime <= to)
    .GroupBy(a => a.DateTime)
    .ToList()
    .ForEach(x => activityCounts[x.Key] = x.Count());