c# - 使用 LINQ 如何按 "calculated field"进行分组

标签 c# .net linq .net-3.5 linq-to-entities

我正在使用 LINQ to EF 并具有以下 LINQ 查询:

var results = (from x in ctx.Items
               group x by x.Year into decades
               orderby decades.Count() descending
               select new { Decade = decades.Key, DecadeCount = decades.Count() });

所以这让我到达了我想去的地方,因为我得到了按年份分割的项目和那一年的项目数量。 (即 2001 - 10、1975 - 15、2005 - 5、1976 - 1)但我真正想做的是按十年(即 2000 年代 - 15、1970 年代 - 16)将它们分解。

如何在 Linq 语句的组子句的“by”部分中有一个“计算字段”。我想我想要的基本上是这样的:

var results = (from x in ctx.Items
               group x by (x => x.Year.Value.ToString().Substring(0, 3) + "0s") into decades
               orderby decades.Count() descending
               select new { Decade = decades.Key, DecadeCount = decades.Count() });

或者更一般的语法,这样我就可以做一些更复杂的评估/计算来完成分组。有什么想法吗?

编辑(更新):

(x => x.Year.Value.ToString().Substring(0, 3) + "0s") - 不起作用 - “LINQ to Entities 无法识别方法 'System.String ToString() ' 方法,并且此方法无法转换为存储表达式。”

(x.Year/10 * 10) - 功能正常(谢谢) - 唯一的“问题”是“s”不在末尾(即 1970 年与 1970 年代)

是否可以在 by 子句中放置一个函数?即通过 this.ManipulateYear(x.Year) 将 x 分组为几十年......或...... x => x.Year.Value.ToString().Substring(0,3) + "0s"??如果能有一些技术(例如调用函数或使用 lambda 表达式)就更好了,这样我就可以涵盖我能想到的任何情况。

再次感谢大家对此的帮助。

最佳答案

您可以使用 let 子句来避免多次计算十年:

from x in ctx.Items
group x by (x.Year / 10 * 10) into decades
let decadeCount = decades.Count()
orderby decadeCount descending
select new { Decade = decades.Key, DecadeCount = decadeCount }

关于c# - 使用 LINQ 如何按 "calculated field"进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384004/

相关文章:

c# - 这是 async void 的正确用法吗? Xamarin

c# - 如何从 C 程序生成 DLL 以用于 C# 项目

c# - Dotnet webclient 超时,但浏览器可以处理 json web 服务的文件

c# - 如何在 LINQ 中重写 C# foreach

c# - 获取值作为 DateTime,但在 DropDownList 中显示为 DateTime.Year(使用 LINQ)

c# - 如何在构建过程中向 C# 程序添加外部信息?

c# - 在 ServiceStack 中设置 MaxRecievedMessageSize

.net - ASP.NET MVC-应该如何处理发送电子邮件?

c# - 在 Xamarin Native Android 应用程序中显示 admob 横幅和插页式广告

c# - 一个语句中的 Linq 和 foreach 是否优于 2 个单独的显式语句?