c# - LINQ:无法将类型 'System.Int32' 转换为类型 'System.Object'

标签 c# .net asp.net-mvc linq entity-framework

我是 MVC、EF 和 LINQ 的新手。

我首先使用 EF 和 DB 从 DB 创建所有模型。我还创建了一个 ViewModel“CourseDetailsVM”:

public class CourseDetailsVM
{
    public int CourseId { get; set; }
    public int CategoryFk { get; set; }
    public int SoftwareFk { get; set; }
    public int TeacherFk { get; set; }
    public string CourseCode { get; set; }
    public string CourseCodeMs { get; set; }
    public string CourseName { get; set; }
    public string CourseDescriptionShort { get; set; }
    public int CourseEventId { get; set; }
    public int? CourseEventDurationInDays { get; set; }
    public int? CourseEventPrice { get; set; }
    public int CourseEventDateId { get; set; }
    public DateTime? CourseEventDateTimeFrom { get; set; }
    public DateTime? CourseEventDateTimeTo { get; set; }
}

在我的类(class) Controller 中,我尝试使用以下查询从 Viewmodel 获取模型(在 linqpad 中有效,但在 mvc 中无效),并且我还使用 ViewData 访问存储库(这工作正常):

// GET: /Course/Details/5

    public ActionResult Details(int id)
    {
        // get courses to display course details using ViewData
        ViewData["Courses"] = _repository.GetCourses(id);

        // get course events
        var result = (from c in db.Courses
                      join ce in db.CourseEvents
                      on c.CourseId equals ce.CourseFk
                      join ced in db.CourseEventDates
                      on ce.CourseEventId equals ced.CourseEventFk
                      group ce by new { ce.CourseEventId, c.CourseId, c.CourseCode, c.CourseName, ce.CourseEventPrice } into grp
                      select new CourseDetailsVM
                      {
                          CourseEventId = grp.Key.CourseEventId,
                          CourseId = grp.Key.CourseId,
                          CourseCode = grp.Key.CourseCode,
                          CourseEventDateTimeFrom = (from c2 in db.CourseEventDates where (c2.CourseEventFk.Equals(grp.Key.CourseEventId)) select c2.CourseEventDateTimeFrom).Min(),
                          CourseEventDateTimeTo = (from c2 in db.CourseEventDates where (c2.CourseEventFk.Equals(grp.Key.CourseEventId)) select c2.CourseEventDateTimeFrom).Max(),
                          CourseEventDurationInDays = (from c2 in db.CourseEventDates where (c2.CourseEventFk.Equals(grp.Key.CourseEventId)) select c2.CourseEventDateTimeFrom).Count() / 2,
                          CourseName = grp.Key.CourseName,
                          CourseEventPrice = grp.Key.CourseEventPrice,
                          CourseEventDateId = grp.Key.CourseEventId
                      }).OrderBy(c => c.CourseEventDateTimeFrom);

    return View("Details", result);
    }

由于 Linq 在运行时编译,因此我可以编译该项目而不会出现任何错误。但是当访问类(class)/详细信息 View 时,我收到以下错误: 无法将类型“System.Int32”转换为类型“System.Object”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

在以下字段上创建 CourseDetailsVM 的新实例时发生错误:CourseEventDateTimeFrom、CourseEventDateTimeTo、CourseEventDurationInDays

我尝试使用硬编码值填充上述属性,效果很好。所以我知道错误发生在哪里,但我不知道为什么以及如何解决它。

根据 Yuliam Chandra 的要求,CourseEventDate 类的内容(由 EF 生成):

public partial class CourseEventDate
{
    public int CourseEventDateId { get; set; }
    public Nullable<int> CourseEventFk { get; set; }
    public Nullable<System.DateTime> CourseEventDateTimeFrom { get; set; }
    public Nullable<System.DateTime> CourseEventDateTimeTo { get; set; }
    public virtual CourseEvent CourseEvent { get; set; }
}

希望你们能帮助我。

谢谢,

浪人

最佳答案

该错误可能是在比较 CourseEventFk 时引起的( int? ) 和 CourseEventId ( int ) 使用 Equals其中其参数接受对象类型,即 CLR 方法。 LINQ to Entities 不支持 CLR 方法。

尝试使用==运算符,它在某种程度上与 L2S 兼容,代码如下。

CourseEventDateTimeFrom = ..where (c2.CourseEventFk == grp.Key.CourseEventId)..
CourseEventDateTimeTo = ..where (c2.CourseEventFk == grp.Key.CourseEventId)..
CourseEventDurationInDays = ..where (c2.CourseEventFk == grp.Key.CourseEventId)..

关于c# - LINQ:无法将类型 'System.Int32' 转换为类型 'System.Object',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745922/

相关文章:

c# - WPF ListBoxItem IsMouseOver

c# - C#中的整数转换

.net - 了解 httpGetEnabled 和 Mex 绑定(bind)

.net - 你如何让 Inno Setup 在执行长执行时看起来不卡住?

c# - 将字典属性作为对象访问

c# - 检查 asp.net mvc ValidationMessage

c# - 授权属性中的角色在 MVC 4 中无法按预期工作

c# - ASP.Net MVC - 路由对象 id == 标题 - 如何处理重复项?

c# - for 循环内的动态标签文本

c# - WPF 中的 INotifyPropertyChanged