Linq 产生错误的 groupby 输出

问题描述 投票:0回答:1

以下代码会产生不正确的输出。它输出 10 个键,每个键有 1 个值。如果我从 Games 中删除 ToList() ,它会生成 2 个键的正确输出,每个键有 5 个值。另外,如果它保持 Games.ToList() 不变并从 GroupBy 中删除 Dto,它会产生正确的输出。如何让此查询与 Games.ToList() 和 Dto 一起正常工作? (Games是一个sql表。注意:当Games是一个列表时它不起作用,但是当Games是IQueryable时它起作用)。

void Main()
    {
        Games.ToList()
        .GroupBy(g => new MatchDto { MatchdayId = g.MatchdayId, KickOffDate = g.KickOffUtc.Date })
        .Select(grp => new
        {
            Key = grp.Key,
            Values = grp.ToList()
        })
        .Dump();
    }

public class MatchDto
{
    public int MatchdayId { get; set; }
    public DateTime KickOffDate { get; set; }
}
c# linq linqpad
1个回答
1
投票

如果

Games
是一个列表(或者保留
.ToList()
),则查询将在客户端上执行。在那里,
GroupBy
将计算密钥(它始终是一个新的
MatchDto
对象),并且由于
MatchDto
不会覆盖
Equals
或实现
IEquatable<MatchDto>
GroupBy
正确地将它们视为不同的。如果
Games
是 EF 表并且您删除了
ToList()
调用,则分组将被转换为 SQL,其中缺少
MatchDto
的实现并不重要。

因此,并不是 Linq 产生了错误的输出,而是您的

MatchDto
实现缺少您期望但未实现的值类型语义。实现此值类型语义的最快方法是将
MatchDto
转换为记录。

© www.soinside.com 2019 - 2024. All rights reserved.