LINQ - 按多个键分组未给出预期结果

Posted

技术标签:

【中文标题】LINQ - 按多个键分组未给出预期结果【英文标题】:LINQ - Group By multiple keys not giving desired results 【发布时间】:2021-10-20 09:09:40 【问题描述】:

我正在尝试使用 Linq 按多个键进行分组。

我有一个 Category Id 和一个与之关联的 Type Id,然后是一个与 Type Id 关联的项目列表。

从我的结果中可以看出,它们没有被分组。

这是我正在使用的查询:

Dim uploads = items.GroupBy(Function(g) New With g.CategoryId, g.TypeId) _
                                       .OrderBy(Function(g) g.Key.CategoryId) _
                                       .ThenBy(Function(g) g.Key.TypeId) _
                                       .Select(Function(g) New UploadListItemViewModel With 
                                            .CategoryId = g.Key.CategoryId,
                                            .TypeId = g.Key.TypeId,
                                            .Uploads = g.ToList()
                                        )

这是结果视图

例如对于 Category 1 / Type 8 ,上传计数应为 3

如果我做错了什么,我们将不胜感激。

【问题讨论】:

Key .Uploads 是错字吗? 为什么是错字?是不是因为某种原因错了? 您在组选择器 (New With Key g.CategoryId, Key g.TypeId)) 中缺少 Key 关键字。没有它,分组就无法工作。我假设Uploads 是一个整数,所以你应该在那里有.Uploads = g.Sum(Function(m) m.Uploads)。否则,发布类模型。 @Jimi 我刚刚发现我也缺少来自另一个来源的 Key 关键字。我把它放进去就可以了。谢谢你也确认了这一点。 【参考方案1】:

在组选择器中缺少 Key 关键字。

最终固定代码是

Dim uploads = items.GroupBy(Function(x) New With Key x.CategoryId, Key x.TypeId) _
                                       .OrderBy(Function(x) x.Key.CategoryId) _
                                       .ThenBy(Function(x) x.Key.TypeId) _
                                       .Select(Function(g) New SKUProductUploadListItemViewModel With 
                                            .CategoryId = g.Key.CategoryId,
                                            .TypeId = g.Key.TypeId,
                                            .Uploads = g.ToList()
                                        )

【讨论】:

只是想知道为什么要对它进行排序;远端关心吗?如果不这样做,这是一个不必要的昂贵操作

以上是关于LINQ - 按多个键分组未给出预期结果的主要内容,如果未能解决你的问题,请参考以下文章

配置单元查询中的多个计数未给出预期结果

按每周一分组数据未按预期工作

字符串比较未按预期工作。我想比较两个字符串值,但比较似乎总是给出一个真实的结果

如何使用 Linq 按日期时间和平均结果对字典进行分组

SQL 按年份分组给出不正确的结果

Jsonmodel - 模型集合映射未给出预期结果