[英]Nested Groups Linq query vs Groupby extension method
我试图使用GroupBy
扩展方法转换下面的嵌套分组。
var res = from th in teamHistories
group th by th.Date into grp1
from grp2 in
(from th in grp1 group th by th.Event)
group grp2 by grp1.Key;
这将返回IEnumerable<IGrouping<KeySelector, IGrouping<KeySelector, Object>>
; 它产生一个像树一样的结构 -
FirstGroup -> Key(Date)
Elements - SecondGroup -> Key(Event)
Elements - (TeamHistory) ..
但是当我尝试使用GroupBy扩展方法编写类似的查询时,它似乎工作方式不同。 根据Groupby方法的签名,它返回IEnumerable<IGrouping<TKey, TSource>>
。 意味着如果我尝试进行嵌套,它将返回IEnumerable<IEnumerable<IGrouping<KeySelector, Elements>>>
, IEnumerable<IEnumerable<IGrouping<KeySelector, Elements>>>
它会产生不希望的结果。
这是我试过的:
var res1 = teamHistories.GroupBy(x => x.Date, (key, g1) =>
g1.Select(x => new { key, x })
.GroupBy(x => x.x.Event, g => g));
题 -
这种嵌套是否正确? 因为我得到的结果是不同的。 它返回IEnumerable<IEnumerable<IGrouping<KeySelector, Elements>>>
而不是IEnumerable<KeySelector, IGrouping<KeySelector, IGrouping<KeySelector, Object>>>
。
与Linq查询中的Group by
子句相比, GroupBy
扩展方法是否有任何限制?
如果有人想要重现结果,这是完整的片段 。
我认为你的第一个查询(在你的剪辑中 )将使用方法语法:
var res1 = teamHistories.Where(th => th.TeamName.ToLower() == "xxx")
.GroupBy(th=>th.Date)
.SelectMany (grp1 => grp1.GroupBy (th => th.Event), (grp1, grp2) => new {grp1 = grp1, grp2 = grp2})
.GroupBy (temp0 => temp0.grp1.Key, temp0 => temp0.grp2);
关于第二个问题,使用方法语法没有限制。 实际上,在编译代码时,必须将使用查询语法的第一个查询转换为.NET公共语言运行库(CLR)的方法调用,因此两者在语义上是相同的,只是查询语法是语法糖,有助于使查询更简单,更容易阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.