使用 LinQ 的嵌套 IGrouping

Nested IGrouping with LinQ

我想知道是否可以从 Linq 表达式中得到 List<IGrouping<string, IGrouping<string, T>>>。我想做的是按流派和艺术家对歌曲进行排序,但采用一种我可以遍历每种流派和每种流派的格式,针对每张专辑进行迭代。如果可能的话怎么办?或者有更好的方法来实现我想要实现的目标吗?

这是我的歌class

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>> 但我想要的是进一步按艺术家分组。

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

这将 return 几乎是您想要的,但是 IGrouping<string, IGrouping<string, Song>> 只能 return 如果您使用自己的 class 和 IGrouping<K,V> 实现 return =13=] 而不是我上面使用的匿名类型。

尝试在第一个结果中添加第二个分组

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

我想要的是 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 方法语法)。

感谢所有评论的人 and/or 回答。