C#/Linq分组不符合预期问题求助
LINQ分组问题解决:按流派统计艺术家数量
你的问题出在第一次分组的Key设计上——你用{ genre.GenreId, artist.ArtistName }作为分组依据,这会让每个流派+艺术家的组合都单独成为一个分组。所以第二次按这个Key分组时,每个组里自然只有一个元素,根本无法合并同流派下的不同艺术家。
要实现「按流派分组,统计每个流派的艺术家数量」的需求,不需要两次分组,直接一步到位或者先去重再分组即可,以下是两种可行的写法:
写法一:直接按流派分组,组内去重艺术家
var genres_by_artist = from artist in db.Artists join track in db.Tracks on artist.ArtistId equals track.ArtistId join genre in db.Genres on track.GenreId equals genre.GenreId // 直接按流派ID分组 group artist by genre.GenreId into genreGroup select new { GenreId = genreGroup.Key, // 获取该流派下所有不重复的艺术家名称 Artists = genreGroup.DistinctBy(a => a.ArtistId).Select(a => a.ArtistName), // 统计该流派的艺术家数量 ArtistCount = genreGroup.DistinctBy(a => a.ArtistId).Count() };
写法二:先获取唯一的流派-艺术家组合,再分组统计
// 先筛选出所有不重复的流派+艺术家组合(避免同一艺术家因多首歌重复统计) var uniqueGenreArtists = from artist in db.Artists join track in db.Tracks on artist.ArtistId equals track.ArtistId join genre in db.Genres on track.GenreId equals genre.GenreId select new { genre.GenreId, artist.ArtistName, artist.ArtistId } .DistinctBy(x => new { x.GenreId, x.ArtistId }); // 按流派ID分组,统计艺术家数量 var genres_by_artist = from item in uniqueGenreArtists group item by item.GenreId into genreGroup select new { GenreId = genreGroup.Key, Artists = genreGroup.Select(x => x.ArtistName), ArtistCount = genreGroup.Count() };
这两种写法最终都会得到你想要的结果:每个流派对应的Key下,包含该流派的所有艺术家名称,并且ArtistCount是该流派的艺术家总数。
内容的提问来源于stack exchange,提问作者John Scott
相关产品推荐
相关产品推荐

