【问题标题】:LINQ Group by different outputLINQ 按不同输出分组
【发布时间】:2019-06-28 09:28:07
【问题描述】:

我很难将 dbset (EntityFramework) 按两个字段分组并将该输出发送到强类型视图。

当我为复合键使用匿名类型时,我得到了正确的输出。包含一个项目的列表,而该项目又具有两个或多个分组项目。

现在,如果我改用一个类,我会得到一个包含两个项目的列表,然后每个项目都有一个分组项目。

var output = context.Transfers.GroupBy(t=> new { t.TNumber, t.Type}).ToList();

var output2 = context.Transfers.AsEnumerable()
                     .GroupBy(t => new OTSpecs(t.TNumber, t.Type)).ToList();

OTSpecs 只是一个简单的类,具有这些公共字段和一个参数构造函数。

我需要添加 AsEnumerable() 否则我会得到 System.NotSupportedException 在 LINQ to Entities 中仅支持无参数构造函数和初始化程序

也是因为我需要像这样在视图中定义模型

@model IEnumerable<IGrouping<OTSpecs, Transfer>>

除非当然可以用匿名类型替换该行中的 OTSpecs。但我不知道怎么做。

我的问题是为什么这些代码行会产生不同的输出? 是否可以在视图中定义模型来替换匿名类型的 OTSpecs?

【问题讨论】:

  • context.Transfers 是一个数据表。要枚举行,您需要添加“AsEnumerable()。当您有一个类时,您需要该类的 List() 对象,例如: List specs = new List(); 然后您应该能够使用: specs.Group(t => new { t.TNumber, t.Type}).ToList();

标签: c# asp.net-mvc linq group-by


【解决方案1】:

匿名类型实现比较all their properties的相等比较。因此,当您使用匿名类型作为键时,linq 能够识别出两个键对象相同并且应该组合在一起。

我怀疑您的自定义对象并没有实现这些东西,因此只使用了一般对象比较,它只是比较引用。两个关键对象有不同的引用 - 因此不同的组。

要解决此问题,您可能需要传入equality comparer,或在您的类OTSpecs 中实现Equals

【讨论】:

  • 感谢 @RobertHarvey 让我发布了一个更好的问题,以及 Andrei 的答案。我没有完全意识到这一点。我实现了 Equals 和 GetHashCode,它按我的预期工作。
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2017-07-13
相关资源
最近更新 更多