【问题标题】:Getting a wierd 'InvalidCastException' in ASP.NET MVC在 ASP.NET MVC 中获取一个奇怪的“InvalidCastException”
【发布时间】:2017-03-31 12:47:45
【问题描述】:

我在 C# 中遇到以下异常:

InvalidCastException:无法从类型转换 'System.Collections.Generic.List`1[MyProj.Data.Entities.Student]' 到 输入“MyProj.Data.Access.IStudent”。

我的项目编译成功。我有两个对象定义如下:

public interface IStudent
{
    long ID { get; set; }
    string SystemCode { get; set; }
    string FirstName { get; set; }
    string LastName { get; set; }
    DateTime DateOfBirth { get; set; } 
}
public class Student : IStudent
{
    public long ID { get; set; }
    public string SystemCode { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; } 
}

public interface ICourseRequest
{
    long ID { get; set; }
    long StudentID { get; set; }
    int CourseID { get; set; }
    int? FacultyID { get; set; }
    DateTime StartDate { get; set; }
    DateTime CreationDate { get; set; }
    IStudent Student { get; set; }
}

public class CourseRequest : ICourseRequest
{
    public long ID { get; set; }
    public long StudentID { get; set; }
    public int CourseID { get; set; }
    public int? FacultyID { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime CreationDate { get; set; }
    public IStudent Student { get; set; }
}

我正在使用 SQLtoLinq 检索我的数据(从 SQL Server),如下所示:

IList<ICourseRequest> result = _database.course_requests.Select(a => new CourseRequest
{        
    CreationDate = a.crsreq_create_date,
    StartDate = a.crsreq_start,
    FacultyID = a.crsreq_faculty,
    ID = a.crsreq_id,
    CourseID = a.crsreq_crs,
    StudentID = a.crsreq_student,
    Student =  _database.students.Where(p => p.stud_id == a.crsreq_student)
                                 .Select(s => new Student
                                  {
                                      ID = p.stud_id,
                                      DateOfBirth = s.stud_dob,
                                      FirstName = s.stud_fname,
                                      LastName = s.stud_lname,
                                      SystemCode = s.stud_sys_code
                                  }).SingleOrDefault(),
}).ToList<ICourseRequest>();

为什么在项目编译成功时在运行时抛出这个转换异常?

【问题讨论】:

  • 它在哪一行?你确定它来自那个sn-p代码吗?
  • 错误是不言自明的:您试图将List&lt;Student&gt; 转换为接口IStudent,这是无效的。错误是在什么情况下出现的?
  • @TetsuyaYamamoto 但我在嵌套选择的末尾有一个 SingleOrDefault()
  • @Rob 错误在查询中
  • @progrAmmar,您可以尝试在SingleOrDefault() 之前添加ToList() 调用。我很好奇它是否与导致强制转换异常的查询执行方式有关。

标签: c# asp.net asp.net-mvc collections


【解决方案1】:

这很奇怪。我在整个项目中一直在这样查询(与其他对象一起),只有这给出了一个错误。

我通过将其转换为 IStudent 来修复它。我不知道为什么简单的SingleOrDefault 不起作用。谁能解释一下为什么?

这是修复它的原因:

IList<ICourseRequest> result = _database.course_requests.Select(a => new CourseRequest
{        
    CreationDate = a.crsreq_create_date,
    StartDate = a.crsreq_start,
    FacultyID = a.crsreq_faculty,
    ID = a.crsreq_id,
    CourseID = a.crsreq_crs,
    StudentID = a.crsreq_student,
    Student =  _database.students.Where(p => p.stud_id == a.crsreq_student)
                                 .Select(s => new Student
                                  {
                                      ID = p.stud_id,
                                      DateOfBirth = s.stud_dob,
                                      FirstName = s.stud_fname,
                                      LastName = s.stud_lname,
                                      SystemCode = s.stud_sys_code
                                  }).SingleOrDefault() as IStudent, //<-- This is what fixed it
}).ToList<ICourseRequest>();

【讨论】:

  • 可能隐藏了错误并将Student 设置为空。如果你明确地转换它会发生什么? Student = (IStudent)_database.students...?
  • 你可以试试改成SingleOrDefault&lt;IStudent&gt;()吗?看到this answer我相信LinqToSql不知道如何将Student的结果转换为基类型。
  • @Adrian 如果我出于某种原因执行 SIngleOrDefault,则错误将占上风,LinqToSql 认为我正在查询列表!。当最后有一个 SingleOrDefault 时。
  • @progrAmmar 感谢您的启发。在使用接口时,它一定只是 LinqToSql 查询引擎的一个怪癖。我假设如果分配结果的属性是Student 而不是IStudent,问题也会消失。
  • @Adrian 但问题是,我有许多其他对象(以及这些对象的列表)我正在使用相同的查询方法(没有强制转换)并且它们出于某种原因工作。就像我有一个 Examination 类我有接口,我可以在不强制转换的情况下查询:-S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多