2016-01-12 5 views
2

Я хочу знать, можно ли получить List<IGrouping<string, IGrouping<string, T>>> из выражения Linq. Что я хочу сделать, это упорядочить песни по жанрам и исполнителям, но в формате, где я могу перебирать каждый жанр и для каждого жанра, итерации для каждого альбома. Если возможно, как это можно сделать? Или есть лучший подход к тому, чего я хочу достичь?Вложенная перегруппировка с 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>> но то, что я хочу, это еще одна группа по исполнителю.

+0

Возможный дубликат [Linq Getting Customers group по дате, а затем по типу] (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 Lol, у меня есть я! Как-то пропустил эту информацию, спасибо за ссылку. Не совсем интуитивно, хотя, особенно группа ** newGroup2 ** ** newGroup1.Key **, интересно, как она будет выглядеть на третьем уровне, а также в синтаксисе метода. Так или иначе. –

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>> может быть возвращен только в случае реализации IGrouping<K,V> с вашим собственным классом и new, что до вместо анонимного типа я использовал выше.

0

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

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

Я не совсем уверен, что это делает в точности, но он по-прежнему возвращает «Список >». – Jairo

Смежные вопросы