2016-02-12 74 views
3

我試圖使用GroupBy擴展方法轉換成以下嵌套分組。嵌套組Linq查詢與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)); 

問題 -

  1. 正在做這樣的嵌套的這種正確的方法?因爲我得到的結果是不同的。它返回IEnumerable<IEnumerable<IGrouping<KeySelector, Elements>>>而不是IEnumerable<KeySelector, IGrouping<KeySelector, IGrouping<KeySelector, Object>>>

  2. 與Linq查詢中的Group by子句相比,GroupBy擴展方法是否存在任何限制?

這是完整的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); 

關於你的第二個問題,有使用方法的語法沒有限制。實際上,當編譯代碼時,使用查詢語法的第一個查詢必須轉換爲.NET公共語言運行時(CLR)的方法調用,因此兩者在語義上都是相同的,只是查詢語法是語法糖,有助於簡化查詢更容易閱讀。

+0

它返回'IEnumerable >>>'。返回類型被包含在附加的枚舉中。我不得不使用一個額外的循環來獲得實際結果。你知道它是否可以避免? – vendettamit

+0

@vendettamit,我已更新我的查詢 – octavioccl

+0

真棒!現在我必須仔細分析它是如何轉換它的。 +1。 – vendettamit