gpt4 book ai didi

c# - 使用 linq 提供按日期存在的用户总数

转载 作者:行者123 更新时间:2023-11-30 14:31:03 25 4
gpt4 key购买 nike

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

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

public class User
{
public DateTime addDate;
public int status;
bool isActive
}

我想创建一个包含日期范围(即开始日期/结束日期)并显示以下列的报告:

enter image description here

(数字不相加,只是为了展示)

第一列是数据分组依据的日期。第二个是当时已添加到系统的用户数的运行总数。剩下的是首先按 isActive bool 值,然后按状态对用户进行分割。

我可以向 SO 上的一位 linq 专家求助吗?我可以只提取数据并用代码完成,但这不是最佳选择。我想了解如何在 linq 中完成此操作。

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

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

所以在示例中,截至 2014 年 1 月 13 日,有 297 个 addDate 为 13 号或更早。 2014 年 1 月 14 日没有添加任何成员,最终在 2014 年 1 月 15 日又添加了三个用户,截至该日期共计 300 人。

最佳答案

嗯,基本就是这样,我会说......

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)
});

编辑(来自评论)

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

和之前一样,只是换行

TotalMemberShip = repository.Users.Count(x => EntityFunctions.TruncateTime(addDate) <= g.Key)

编辑 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
}

关于c# - 使用 linq 提供按日期存在的用户总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21466415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com