Вложенная 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();