LINQ:无法将类型转换为System.Int32'输入' System.Object'

时间:2014-09-09 13:29:07

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

我是MVC,EF和LINQ的新手。

我首先使用EF和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; }
}

在我的课程控制器中,我尝试使用以下查询从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在运行时编译,我可以编译项目而不会出现任何错误。但是当访问“课程/详细信息”视图时,我收到以下错误: 无法转换类型&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; }
}

我希望你们这些人可以帮助我。

谢谢,

罗宁

2 个答案:

答案 0 :(得分:4)

使用CourseEventFk比较int?CourseEventId)和intEquals)时可能会导致错误,其参数接受对象类型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)..

答案 1 :(得分:0)

我在过去遇到这种错误时所做的是创建一个静态对象(或者在给定时间我需要的任何东西)并自己进行转换,如下所示:

Private static double? myDoubleConversion(string sInput)
{
//conversion logic comes here

return result;
}