2015-09-05 60 views
0

我与这些列的表格:如何groupby和自定义计算在LINQ实体框架?

guid Id 
string UserId 
bool IsActice 
datetime duedate 

当用户激活时,一个记录插入到上面的表格和isActive列是真的。

当他/她禁用激活时,另一条记录插入db和isActive列为false。

现在我想(通过duedate列)按月&日选择和分组然后显示isActive用户数在日期

如:

eg

我该怎么办呢?

+2

你到目前为止试过的东西? – Arash

+0

我也应该问,你的文字是“月和日”,但你的例子也显示了年份。 2015年12月2日应与2014年2月12日分组,还是他们是分开的组? – dman2306

+0

arash jan kheili fullenglish gofti :) saadetar bego lotfan –

回答

1

首先,您必须考虑一个查询来计算每个日期的激活增量(= numberOfActivation - numberOfUnactivation)。

var activityDeltaPerDate = table 
    .GroupBy(x => x.duedate.Date) // group by date ignoring time 
    .Select(group => new { // for each group, sum activation and unactivation 
     Date = group.Key, 
     Delta = group.Sum(x => x.IsActive ? 1 : -1) 
    }); 

特定日期的激活用户数量是直到此日期的增量的总和。 所以,你必须要考虑的一个枚举给所有日期有意思吗:

var firstDate = new DateTime(2015, 1, 1); 
var dates = Enumerable.Range(0, 100) 
    .Select(x => firstDate.AddDays(x)); 

现在,你可以在每个日期计算激活用户的数量:

var activitedUsersPerDate = dates 
    .Select(x => new { 
     Date = x.Date, 
     ActivatedUsers = activitedUsersAtDate.Where(y => y.Date <= x.Date).Sum(y => y.Delta) 
    }; 

如果你想激活用户数每月,只需更改GroupBy键选择器以选择月份的第一天:x => new DateTime(x.duedate.Year, x.dueDate.Month, 1)并更改使用AddMonths而不是AddDays更改dates集合。