以下代码会产生不正确的输出。它输出 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; }
}
如果
Games
是一个列表(或者保留 .ToList()
),则查询将在客户端上执行。在那里,GroupBy
将计算密钥(它始终是一个新的MatchDto
对象),并且由于MatchDto
不会覆盖Equals
或实现IEquatable<MatchDto>
,GroupBy
正确地将它们视为不同的。如果 Games
是 EF 表并且您删除了 ToList()
调用,则分组将被转换为 SQL,其中缺少 MatchDto
的实现并不重要。
因此,并不是 Linq 产生了错误的输出,而是您的
MatchDto
实现缺少您期望但未实现的值类型语义。实现此值类型语义的最快方法是将 MatchDto
转换为记录。