繁体   English   中英

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

[英]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));

题 -

  1. 这种嵌套是否正确? 因为我得到的结果是不同的。 它返回IEnumerable<IEnumerable<IGrouping<KeySelector, Elements>>>而不是IEnumerable<KeySelector, IGrouping<KeySelector, IGrouping<KeySelector, Object>>>

  2. 与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM