嵌套组Linq查询与Groupby扩展方法

我正在尝试使用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&gt ;;产生树状结构-

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)的方法调用,因此两者在语义上是相同的,只是查询语法是一种语法糖,有助于使查询更简单,更简单.更容易阅读.

上一篇:首页> C#>如何做到既过滤和分组列表视图从SQL


下一篇:c#-Linq-项目列表将列表与列表中的C对象分组在一起