Вложенная IGrouping с LinQ

Я хочу знать, возможно ли получить List<IGrouping<string, IGrouping<string, T>>> из выражения Linq. То, что я хочу сделать, это упорядочить песни по жанрам и исполнителям, но в формате, в котором я могу повторять каждый жанр и для каждого жанра, повторять для каждого альбома. Если это возможно, как это можно сделать? Или есть лучший подход к тому, чего я хочу достичь?

Вот мой класс песни

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>> но то, что я хочу, - это дальнейшая группировка по Artist

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

Спасибо всем, кто прокомментировал и / или ответил.

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

Это вернет почти то, что вы хотите, однако IGrouping<string, IGrouping<string, Song>> может быть возвращено только если вы реализуете IGrouping<K,V> с вашим собственным классом и new что вместо анонимного типа я использовал выше.

Попробуйте добавить вторую группу к результатам первого

var songs = db.Songs.GroupBy(s => s.Artist).SelectMany(s => s.GroupBy (d =>  d.Genre)).OrderBy (s => s.Key).ToList();
Другие вопросы по тегам