使用LinQ进行嵌套的IGrouping

本文关键字:IGrouping 嵌套 LinQ 使用 | 更新日期: 2023-09-27 18:29:55

我想知道是否可以从Linq表达式中获得List<IGrouping<string, IGrouping<string, T>>>。我想做的是按流派和艺术家排序歌曲,但我可以迭代每一种流派,对于每一种类型,迭代每一张专辑。如果可能的话,怎么做?还是有更好的方法来实现我想要实现的目标?

这是我的宋级

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

使用LinQ进行嵌套的IGrouping

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

感谢所有发表评论和/或回答的人。

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

这几乎会返回您想要的内容,但是只有当您用自己的类和new实现IGrouping<K,V>,而不是我上面使用的匿名类型时,才能返回IGrouping<string, IGrouping<string, Song>>

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

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