我很难按两个字段对 dbset (EntityFramework) 进行分组并将输出发送到强类型 View 。
当我为复合键使用匿名类型时,我得到了正确的输出。包含一个项目的列表,该项目又包含两个或更多分组项目。
现在,如果我改用一个类,我会得到一个包含两个项目的列表,而每个项目又有一个分组项目。
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
只是一个简单的类,具有那些公共(public)字段和一个参数构造函数。
我需要添加 AsEnumerable()
否则我会得到一个 System.NotSupportedException
LINQ to Entities 中仅支持无参数构造函数和初始值设定项
也是因为我需要像这样在 View 中定义模型
@model IEnumerable<IGrouping<OTSpecs, Transfer>>
当然,除非可以用匿名类型替换该行中的 OTSpecs。但我不知道怎么办。
我的问题是为什么这些代码行会产生不同的输出? 是否可以在 View 中定义模型以替换匿名类型的 OTSpec?
最佳答案
匿名类型实现比较 all their properties 的相等比较.因此,当您使用匿名类型作为键时,linq 能够识别出两个键对象相同并且应该组合在一起。
我怀疑您的自定义对象没有实现这些东西,因此只使用一般对象比较,它只是比较引用。两个关键对象具有不同的引用 - 因此不同的组。
要解决此问题,您可能需要传入 equality comparer ,或在您的类 OTSpecs
中实现 Equals
。
关于c# - LINQ 按不同输出分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54519545/