6

我正在使用 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)我真正想做的事情是按十年(即 2000s - 15、1970s - 16)分解它们。

如何在 Linq 语句的 group 子句的“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 表达式),这样我就可以涵盖我能想到的任何情况。

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

4

4 回答 4

7

您可以使用该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 }
于 2008-12-21T23:55:35.070 回答
6

按 x.Year/10 分组怎么样?(没有测试过这个!)

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

EDIT1:将 (x.Year / 10) 更改为 (x.Year / 10 * 10) 以获取例如 1980 而不是 198。

EDIT2:在您的示例中,“将 x 按 x.Year.Value.ToString().Substring(0, 3) + "0s") 分组为几十年”也应该有效。不需要 Lamba 语法。

EDIT3:删除了一个额外的 * 10。谢谢马克!

于 2008-12-21T02:15:41.373 回答
2

看起来我们无法对实体框架的部分类中定义的计算字段进行分组或选择或类似操作。

计算的字段可用于 LINQ to 对象(因此您可以将所有数据作为对象返回,然后进行分组)

于 2009-10-11T23:45:16.123 回答
0

我相信您会将 SelectMany 方法链接到结果的末尾。这将返回 IEnumerable 的 IEnumerable。

于 2008-12-21T02:09:51.417 回答