使用linq提供按日期存在的用户总数的运行总计

And*_*way 3 c# linq entity-framework

这个前提非常简单,但我似乎无法确定如何在linq中描述这一点.我正在使用EF,我应该能够在一个查询中提取数据.

我有一个用户对象具有以下(简化):

public class User
{
  public DateTime addDate;
  public int status;
  bool isActive
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个报告,该报告采用显示以下列的日期范围(即startDate/endDate):

在此输入图像描述

(数字不加,只是为了表演)

第一列是数据按日期分组的日期.第二个是当时已添加到系统的用户数的运行总计.其余的是首先由isActive bool分解用户,然后按状态分解.

我是否可以向SO的一位知识渊博小组寻求帮助?我可以将数据拉入并在代码中执行,但这不是最佳的.我想了解如何在linq中完成这项工作.

==================================

编辑:我意识到有一件我不清楚.这些数字并不反映当天加入的成员数量,而是迄今为止的总数.我相信我可能正在寻找一个聚合,但我不确定.也许一笔钱也可以.

因此,在该示例中,截至2014年1月13日,有297个具有13或更早的addDate.2014年1月14日,没有成员被添加,最后在2014年1月15日增加了三个用户,总共300个用户.

Rap*_*aus 6

好吧,基本就是这样的,我会说......

var result = repository.Users
             .GroupBy(m => EntityFunctions.TruncateTime(addDate))
             .Select(g => new {
                 Date = g.Key,
                 TotalMemberShip = g.Count(),
                 IsActiveWithStatus1 = g.Count(x => x.isActive && x.status == 1),
                 IsActiveWithStatus2 = g.Count(x => x.isActive && x.status == 2),
                 IsInactiveWithStatus1 = g.Count(x => !x.isActive && x.status == 1),
                 IsInactivewithStatus2 = g.Count(x => !x.isActive && x.status == 2)
             });
Run Code Online (Sandbox Code Playgroud)

编辑(来自评论)

嗯,我会尝试这个,但绝对不确定这会有效

和以前一样,只需更改线

TotalMemberShip = repository.Users.Count(x => EntityFunctions.TruncateTime(addDate) <= g.Key)
Run Code Online (Sandbox Code Playgroud)

编辑2

好吧,也许更喜欢这个(我使用这个语法let,如果你需要所有结果的"聚合" ,它有关键字).

from item in repository.Users
group item by EntityFunctions.TruncateTime(addDate) into g
let datesBefore = repository.Users.Where(x => EntityFunctions.TruncateTime(addDate) <= g.Key)
select new {
  Date = g.Key,
  TotalMemberShip = datesBefore.Count(),
  IsActiveWithStatus1 = datesBefore.Count(x => x.isActive && x.status == 1),
  //etc.
  //if you need datas BEFORE (and equal) use datesBefore.Count
  //if you need datas "at the exact day" use g.Count
}
Run Code Online (Sandbox Code Playgroud)