Chinook Database LINQ查询:Playlist主流派返回List类型错误修复
问题根因
- 统计逻辑错误:你当前排序用的
y.Genre.Tracks.Count是统计全库中该流派的总曲目数,而非当前播放列表内该流派的曲目数,得到的结果不是当前播放列表的占比最高流派。 - 类型输出问题:
Zanr属性是IEnumerable<string>集合类型,直接在ToString方法中插值输出时,默认会调用集合的基类ToString方法,只会输出集合的类型名称,不会输出集合内的元素值。
修复方案
场景1:仅需取单个占比最高的流派
- 修改DTO定义,将Zanr改为字符串类型
public class PlaylistaDTO { public string Pesma { get; set; } public int brojPesama { get; set; } // 改为存储单个流派名称的字符串类型 public string Zanr { get; set; } public override string ToString() { return $"播放列表: {Pesma}," + $"曲目总数: {brojPesama}," + $"主流派: {Zanr}"; } }
- 修改LINQ查询逻辑,按当前播放列表内的流派分组统计取最高
var playlist = _entities.Playlists.Select(x => new PlaylistaDTO { Pesma = x.Name, brojPesama = x.Tracks.Count, Zanr = x.Tracks // 按当前播放列表内的曲目流派名称分组 .GroupBy(t => t.Genre.Name) // 按分组内的曲目数量倒序排序 .OrderByDescending(g => g.Count()) // 取排序第一的流派名称,为空的话返回默认值 .Select(g => g.Key) .FirstOrDefault() ?? "无流派" }).ToList(); foreach (var p in playlist) { Console.WriteLine(p); }
场景2:存在并列第一时需要输出所有主流派
- 保留Zanr为
IEnumerable<string>类型,修改ToString方法拼接集合元素
public class PlaylistaDTO { public string Pesma { get; set; } public int brojPesama { get; set; } public IEnumerable<string> Zanr { get; set; } public override string ToString() { return $"播放列表: {Pesma}," + $"曲目总数: {brojPesama}," + $"主流派: {string.Join("、", Zanr ?? Enumerable.Empty<string>())}"; } }
- 修改LINQ查询逻辑,取所有并列最高的流派
var playlist = _entities.Playlists.Select(x => new PlaylistaDTO { Pesma = x.Name, brojPesama = x.Tracks.Count, Zanr = x.Tracks .GroupBy(t => t.Genre.Name) // 按相同的流派曲目数二次分组,取数量最高的一组 .GroupBy(g => g.Count()) .OrderByDescending(g => g.Key) .FirstOrDefault()? .Select(g => g.Key) .ToList() ?? new List<string>{"无流派"} }).ToList(); foreach (var p in playlist) { Console.WriteLine(p); }
内容的提问来源于stack exchange,提问作者Luka Vujovic
相关产品推荐
相关产品推荐

