【问题标题】:Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type无法隐式转换类型'System.Collections.Generic.List<<匿名类型
【发布时间】:2021-01-06 09:14:09
【问题描述】:

完整的异常消息:

不能隐式转换类型 'System.Collections.Generic.List>'到 'System.Collections.Generic.IList'。 存在显式转换(您是否缺少演员表?) [Schedular.API]

public async Task<IList<TaskSchedule>> GetTaskSchedulesByUser(int UserId)
{           
    var userTaskSchedule = await _context.TaskSchedules
        .Join(_context.Notes, 
              schedule => schedule.Id, 
              note => note.Id, 
              (schedule, note) => new { schedule, note })
        .Where(u => u.schedule.userId == UserId)
        .ToListAsync(); 

    return userTaskSchedule;            
}

我相信方法的返回类型需要改变,但我不确定是什么。

型号

父表 = taskSchedule

子表 = 笔记

笔记模型

public class Note
{
    public int Id { get; set; }
    public string NotesInfo { get; set; }
    public DateTime dateCreated {get; set;}
    public TaskSchedule taskSchedule {get; set;}
    public User user { get; set; }
    public int userId { get; set; } 
}

任务调度模型

public class TaskSchedule
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public User user { get; set; }
    public int userId { get; set; }     
}

【问题讨论】:

  • 这是什么味道的ORM?我不确定您是否需要加入。从方法签名来看,您可能只想要return await _context.TaskSchedules.Where(u =&gt; u.schedule.userId == UserId).ToListAsync()。如果你也想返回笔记,并且在TaskSchedule中没有地方可以保存笔记,你需要修改方法返回类型
  • ORM = Entityframework 我需要注释,因为它在单独的表上。 “Taskschedule”与“Note”有一对多的关系。我应该能够在“任务计划”中添加尽可能多的注释。您编写的代码最初是我的代码,它可以工作,但是我无法查看注释。有没有办法把它加入到笔记表中?
  • 我可以请求你用它标记你的问题版本(以及它是否是核心/不是),例如用efcore 和efcore-3.1 标记。 TaskSchedule 是否对笔记有 nav 属性?包含实体类及其映射配置时,EF 问题通常更容易回答
  • 错误很明显。 JOIN 创建了一个不匹配的新匿名类型,它结合了 TaskSchedule 和 doesn't 匹配返回类型的 Note。如果您不想返回这两种类型,为什么要加入 Notes?
  • 此外,JOIN 是由 ORM 根据实体之间的关系生成的。如果您必须显式使用 JOIN,则非常强烈地表明模型和实体是错误的。 TaskSchedule 应该有一个 Note 或 Notes 属性

标签: c# linq entity-framework-core asp.net-core-3.1 ef-core-3.1


【解决方案1】:

我希望您的 TaskSchedule 看起来像:

public class TaskSchedule
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public User user { get; set; }
    public int userId { get; set; }  

    public List<Note> Notes { get; set; }  
}

(Note 类仍将具有单个 TaskSchedule 属性 - EF 可以推断 TS:N 为 1:M,因为 rel 的一端是单个属性,另一端是集合)

并且要获取任务计划及其注释,您可以例如说:

public async Task<IList<TaskSchedule>> GetTaskSchedulesByUser(int UserId)
{           
    var userTaskSchedule = await _context.TaskSchedules
        .Include(ts => ts.Notes)
        .Where(u => u.schedule.userId == UserId)
        .ToListAsync(); 

    return userTaskSchedule;            
}

how to configure relationships 和 how to query related data 上的大量信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多