2016-02-12 2 views
3

Я пытался преобразовать ниже вложенную группировку с использованием метода расширения GroupBy.Вложенные группы Linq query vs Groupby extension method

 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)); 

Вопрос -

  1. Является ли это правильный способ сделать такой вложенности? Потому что результаты, которые я получаю, разные. Он возвращает IEnumerable<IEnumerable<IGrouping<KeySelector, Elements>>> вместо IEnumerable<KeySelector, IGrouping<KeySelector, IGrouping<KeySelector, Object>>>.

  2. Существуют ли какие-либо ограничения при использовании методов расширения GroupBy по сравнению с предложением Group by в запросе Linq?

Полный текст snippet Если кто-то хочет воспроизвести результат.

ответ

3

Я думаю, что первый запрос (в вашем 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); 

О втором вопросе не существует каких-либо ограничений с использованием синтаксиса метода. Фактически, ваш первый запрос, использующий синтаксис запроса, должен быть переведен в вызовы методов для среды CLR общего времени .NET (CLR) при компиляции кода, поэтому оба семантически идентичны, просто синтаксический синтаксис запроса, который помогает упростить запросы и легче читать.

+0

Он возвращает 'IEnumerable >>>'. Тип возвращаемого значения завершается дополнительным перечислением. Я должен был использовать дополнительный цикл для получения фактического результата. Знаете ли вы, как можно его избежать? – vendettamit

+0

@vendettamit, Я обновил свой запрос – octavioccl

+0

Awesome !! Теперь я должен тщательно проанализировать, как вы его преобразовали. +1. – vendettamit