代码之家  ›  专栏  ›  技术社区  ›  Chris Barry

无法将类型“system.linq.iqueryable<project.models.tasktimeline>”隐式转换为“project.models.tasktimeline”

  •  1
  • Chris Barry  · 技术社区  · 15 年前

    我正试图将自定义形状的类传递给视图,但我遇到了一些麻烦。

    这就是我犯的错误。

    无法将类型“System.Linq.IQueryable”隐式转换为“Project.Models.TaskTimeline”。存在显式转换(是否缺少强制转换?)

    这是我第一次将列表添加到类中,并尝试将一个列表按原样传递给另一个列表。

    这是类定义

      public class TaskTimeLine
      {
        public Task task { get; set; } // to hold a single object 
        public List<DateTime> scheduledDateTime { get; set; } // to hold a collection of    date times..
    
      }
    

    控制器的动作就是这样。

     [Authorize]
        public ActionResult Details2(int id)
        {
            TaskTimeLine task = new TaskTimeLine(); //create new instance of TaskTimeLine
            task = (IQueryable<TaskTimeLine>)taskRepository.GetTaskAndTimeLine(id);
    
            if (task == null)
                return View("NotFound");
            else
                return View("Details", task);
        }
    

    到现在为止一切都很正常,所以我猜这里可能出了问题。

      public IQueryable<TaskTimeLine> GetTaskAndTimeLine(int taskId)
        {
           TaskTimeLine taskTimeLine = new TaskTimeLine(); // create new main object
           taskTimeLine.scheduledDateTime = new List<DateTime>(); instanciate list object inside          
           taskTimeLine.task = db.Tasks.SingleOrDefault(d => d.id == taskId); read the record to fill the single task object
    
    
           /// Lots of logic is performed here to add loads of date records to the list object.
    
           /// If I add a break point and check the list I can see that all the date items have gone fine into the collection           
    
    
           return (IQueryable<TaskTimeLine>)taskTimeLine;
        }
    

    唯一的原因是我有这么多奇怪的地方,因为似乎这些帮助程序编译。它目前没有编译,但我确实做到了,但是当运行实际的请求时,它会失败,并显示相同的错误消息。

    任何人都能帮上忙吗?也许能为未来陷入这种困境的人增加一个更有用的头衔。

    3 回复  |  直到 13 年前
        1
  •  9
  •   Marc Gravell    15 年前

    taskTimeLine 是一个 TaskTimeLine 为什么它也是 IQueryable<TaskTimeLine> ?

      TaskTimeLine taskTimeLine = new TaskTimeLine(); // create new main object
      ....
      return (IQueryable<TaskTimeLine>)taskTimeLine;
    

    IQueryable<T> 来源 数据-不是数据本身的实例(可能的例外: Enumerable.AsQueryable() )

    我怀疑你的方法 GetTaskAndTimeLine 应该只是返回 任务时间表 失去了很多石膏…

    public TaskTimeLine GetTaskAndTimeLine(int taskId)
    {
       TaskTimeLine taskTimeLine = new TaskTimeLine(); // create new main object
       ...[snip]
       return taskTimeLine;
    }
    ...
    TaskTimeLine task = taskRepository.GetTaskAndTimeLine(id);
    
        2
  •  4
  •   ParPar    13 年前

    我也有这个错误,我通过添加 FirstOrDefault() 排队。

    在这种情况下,在此行:

    task = (IQueryable<TaskTimeLine>)taskRepository.GetTaskAndTimeLine(id).FirstOrDefault();

    (这是因为 IQueryable 需要多个对象,但不能将某些对象转换为一个对象 task ,仅当您告诉它通过添加 第一个或默认值() )

        3
  •  1
  •   itowlson    15 年前

    在details2方法中:

    TaskTimeLine task = new TaskTimeLine(); //create new instance of TaskTimeLine
    task = (IQueryable<TaskTimeLine>)taskRepository.GetTaskAndTimeLine(id);
    

    在这里,您声明任务为任务时间线,然后尝试加载 IQueryable<TaskTimeLine> 在那个变量中。这些类型不兼容。

    更改存储库方法以返回tasktimeline而不是iQueryable(这也将消除Marc标识的getTaskandTimeline方法中的强制转换问题),然后删除强制转换:

    TaskTimeLine task = taskRepository.GetTaskAndTimeLine(id);