c# - LINQ 按不同输出分组

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

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

相关文章:

asp.net-mvc - 我可以在MVC 3中拥有/链接超过1个_Layout页面吗?一个cshtml页面?

c# - 使用 Linq 检查 C# 中的目录

C# Linq 查询返回类型到字典

.net - LINQ中的“Most popular” GROUP BY?

C#:将派生类作为一个泛型参数传递

c# - WinForms 属性网格不允许我更改结构值

c# - 无法理解相对路径

c# - MVC - 单元测试错误的东西?

jquery - 确认暂停表单提交,直到按下“确定”

c# - 确定对应用程序文件夹的写入权限