我正在尝试使用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>>.当然,这会产生不希望的结果.
这是我尝试过的:
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扩展方法是否有任何限制?
如果有人想重现结果,则为完整的snippet.
解决方法:
我认为您的第一个查询(在您的snipped中)将使用方法语法以这种方式进行:
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)的方法调用,因此两者在语义上是相同的,只是查询语法是一种语法糖,有助于使查询更简单,更简单.更容易阅读.