LINQ按不同的输出分组

时间:2019-02-04 15:41:16

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

我很难按两个字段将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>>

除非当然可以用匿名类型替换该行中的OTSpec。但是我不知道如何。

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

1 个答案:

答案 0 :(得分:3)

匿名类型实现比较all their properties的相等性比较。因此,当您使用匿名类型作为密钥时,linq能够识别出两个密钥对象相同,应该将它们分组在一起。

我怀疑您的自定义对象没有实现这些东西,因此,它仅使用常规对象比较,而后者只是比较引用。两个关键对象的引用不同,因此组也不同。

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