使用 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 回答。
我想知道是否可以从 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 回答。