2015-09-05 62 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集合。