我很难按两个字段将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替换为匿名类型?
答案 0 :(得分:3)
匿名类型实现比较all their properties的相等性比较。因此,当您使用匿名类型作为密钥时,linq能够识别出两个密钥对象相同,应该将它们分组在一起。
我怀疑您的自定义对象没有实现这些东西,因此,它仅使用常规对象比较,而后者只是比较引用。两个关键对象的引用不同,因此组也不同。
要解决此问题,您可能需要传递equality comparer或在类Equals
中实现OTSpecs
。