当前位置:  开发笔记 > 编程语言 > 正文

使用LINQ如何通过"计算字段"进行分组

如何解决《使用LINQ如何通过"计算字段"进行分组》经验,为你挑选了2个好方法。

我正在使用LINQ到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语句的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().子字符串(0,3)+"0s") - 不起作用 - "LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式."

(x.年/ 10*10) - 功能正常(谢谢) - 唯一的"问题"是's'不在最后(即1970年代与1970年代)

无论如何将函数放在by子句中?即组x由此.管理年(x.Year)到几十年......或者...... x => x.Year.Value.ToString().子串(0,3)+"0s"?? 拥有一些技术(例如调用函数或使用lambda表达式)会很好,这样我就可以覆盖任何我能想到的情况.

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



1> Bryan Watts..:

您可以使用该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 }



2> Lucas..:

如何按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()组成.子串(0,3)+"0s")到几十年"也应该有效.不需要lamba语法.

EDIT3:删除了额外的*10.感谢Marc!

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有