gpt4 book ai didi

c# - Linq 按对象分组然后选择

转载 作者:行者123 更新时间:2023-11-30 20:18:03 24 4
gpt4 key购买 nike

我希望按记录的 LeagueIdDate 对记录进行分组。然后按日期排序 desc,然后选择第一次出现的不同 LeagueId。到目前为止,我有类似的东西,但我不知道如何在第一次出现不同的 LeagueId 时选择统计信息。

var stats =
_statsRepository.FindBy(x => x.Active)
.GroupBy(x => new { x.LeagueId, x.Date })
.OrderByDescending(x => x.Key.Date)
.SelectMany(x => x);

这几乎是获取每个联赛最新统计数据的一种方式。所以联赛 1 = 12/02/2017,联赛 2 可能是 02/02/17。 <--- 忽略这一点,可能会产生误导。

联盟中的某个日期有很多统计记录。因此,对于每个联赛的某个特定日期,会有多个统计数据。

Record 1:
09/01/14,
Jim,
4 Goals,
League 1

Record 2:
13/01/14,
Jack,
2 Goals,
League 1

Record 3:
13/01/14,
James,
2 Goals,
League 1

Record 4:
15/01/14,
Hannah,
2 Goals,
League 2

Record 5:
15/01/14,
Harmony,
1 Goal,
League 2

Record 6:
10/01/14,
Alision,
3 Goals,
League 2

应该选择的记录是

Record 2:
13/01/14,
Jack,
2 Goals,
League 1

Record 3:
13/01/14,
James,
2 Goals,
League 1

Record 4:
15/01/14,
Hannah,
2 Goals,
League 2

Record 5:
15/01/14,
Harmony,
1 Goal,
League 2

解释:对于联赛 1,记录 2 和 3 出现在记录 1 之后,因此它们都被选中。对于联赛 2 记录,应选择 4 和 5,因为它们是最新日期。

最佳答案

使用最新更新,您需要按 LeagueId 分组并简单地从每个分组中获取所有记录 Date等于最大值 Date在分组中:

var stats = _statsRepository.FindBy(x => x.Active)
.GroupBy(x => x.LeagueId)
.SelectMany(g => g.Where(x => x.Date == g.Max(y => y.Date));

获得相同结果的另一种方法是使用 !Any (SQL NOT EXISTS) 构造:

var baseStats = _statsRepository.FindBy(x => x.Active);
var stats = baseStats
.Where(x => !baseStats.Any(y => y.LeagueId == x.LeagueId && y.Date > x.Date));

我假设您使用 IQueryable s(即不是 LINQ to Objects,在这些事情很重要的地方),所以没有优化像中间 Select需要 s。

关于c# - Linq 按对象分组然后选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597954/

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