You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 匿名对象中使用三元表达式返回默认集合时出现Add方法重载报错

报错原因

  • 直接报错点:List集合初始化语法错误。你写的new List<Dictionary<string, int>> { { "CurrentChapter", 0 }, { "Completed", 0 } }试图直接向List中传入两个键值对,编译器会匹配List的Add方法,而List的Add方法仅支持传入1个参数(即单个Dictionary对象),不存在接收2个参数的Add重载,因此触发报错。
  • 隐藏逻辑错误:你写的判断条件c.Progress.ToList().Select(x => new { x.CurrentChapter, x.Completed }) != null永远为真,因为LINQ的Select方法返回的IEnumerable对象不可能为null,即便Progress没有数据,也只会返回空集合而非null,因此这个三元判断永远不会走到兜底分支。
  • 隐藏类型不兼容错误:三元表达式要求两个分支的返回类型必须兼容,你前一个分支返回的是匿名类型的IEnumerable,后一个分支原本想返回Dictionary集合,二者类型完全不匹配,即便修复初始化语法,也会触发编译错误。

修复方案

首先统一前后分支的返回类型,都使用相同结构的匿名对象,同时把判断条件改为检查Progress是否存在数据。如果你的Progress导航属性可能为null,可将判断条件改为c.Progress?.Any() == true避免空引用异常。修正后的代码如下:

var courses = await _context.courses
    .Include(c => c.Progress)
    .ToListAsync();

var myCourses = courses
    .Select(c => new
    {
        Title = c.Title,
        Progress = c.Progress.Any() 
            ? c.Progress.Select(x => new { x.CurrentChapter, x.Completed }).ToList()
            : new List<object> { new { CurrentChapter = 0, Completed = 0 } }
    })
    .ToList();
    
return Ok(myCourses);

如果框架序列化时对匿名类型兼容有问题,也可以显式声明Dto类替代匿名类型,逻辑完全一致。

内容的提问来源于stack exchange,提问作者Sami-L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:57:01