2016-01-12 114 views
2

我想知道是否有可能從Linq表達式中獲得List<IGrouping<string, IGrouping<string, T>>>。我想做的是按流派和藝術家排列歌曲,但是我可以通過每種流派和每種流派迭代的格式,爲每張專輯進行迭代。如果可能的話該怎麼辦?還是有更好的方法來實現我想要實現的目標?與LinQ嵌套IGrouping

這是我的歌類

public class Song 
{ 
    [StringLength(100)] 
    public string Album { get; set; } 

    public int Id { get; set; } 

    [StringLength(100)] 
    public string Title { get; set; } 

    [StringLength(100)] 
    public string Genre { get; set; } 

    [StringLength(255)] 
    public string Comment { get; set; } 

    [StringLength(4)] 
    public string Year { get; set; } 

    [StringLength(100)] 
    public string Author { get; set; } 

    public int Length { get; set; } 

    [StringLength(255)] 
    public string Photo { get; set; } 

    [StringLength(255)] 
    public string FileName { get; set; } 

    public string Extension { get; set; } 
} 

而且此查詢我在這裏

var songs = db.Songs.GroupBy(s => s.Genre).ToList(); 

給了我一個List<IGrouping<string, Song>>,但我要的是進一步按藝術家。

+0

[Linq Getting Customers group by date,then by type]可能重複(http://stackoverflow.com/questions/19703034/linq-getting-customers-group-by-date-and-then-by-他們的類型) – Clint

回答

3

我想要的是什麼結果的List<IGrouping<string, IGrouping<string, Song>>>和該代碼給了我正是我想要

  var queryNestedGroups = 
      (from song in db.Songs 
      group song by song.Genre into newGroup1 
      from newGroup2 in 
       (from song in newGroup1 
       group song by song.Author) 
      group newGroup2 by newGroup1.Key).ToList(); 

(雖然我不很確定如何將它翻譯成linq方法的語法)。

感謝所有評論和/或回答的人。

+0

其實這很有趣,我從來沒有見過這樣的用法。 +1 –

+0

@IvanStoev - 是的,這是:)這是[嵌套分組](https://msdn.microsoft.com/en-us/library/bb545974.aspx)。 –

+0

@RahulSingh哈哈,你有我!不知何故,錯過了這些信息,謝謝你的鏈接。不太直觀,尤其是** newGroup1.Key **組的** newGroup2 **,想知道它將如何看待第三級,還有方法語法。無論如何。 –

2
var songs = db.Songs.GroupBy(s => s.Genre, (genre, genreGroup) => new 
            { 
             Genre = genre, 
             ArtistGroup = genreGroup.GroupBy(s => s.Artist) 
            }); 

這幾乎回到你想要的東西,但是IGrouping<string, IGrouping<string, Song>>只能如果你與你自己的類和new那達,而不是匿名類型上面使用實施IGrouping<K,V>返回。

0

嘗試添加第二個分組到第一

var songs = db.Songs.GroupBy(s => s.Artist).SelectMany(s => s.GroupBy (d => d.Genre)).OrderBy (s => s.Key).ToList(); 
+0

我不太清楚這是幹什麼的,但它仍然會返回一個'List >'。 – Jairo